Mercurial > octave-nkf
comparison libinterp/corefcn/jit-typeinfo.cc @ 18599:256e16c9edb5 draft
Fully uint32 type support
author | LYH <lyh.kernel@gmail.com> |
---|---|
date | Fri, 21 Mar 2014 14:59:39 -0400 |
parents | e6c2400e2ca4 |
children |
comparison
equal
deleted
inserted
replaced
18598:e6c2400e2ca4 | 18599:256e16c9edb5 |
---|---|
73 #include "ov-int16.h" | 73 #include "ov-int16.h" |
74 #include "ov-int32.h" | 74 #include "ov-int32.h" |
75 #include "ov-int64.h" | 75 #include "ov-int64.h" |
76 #include "ov-uint8.h" | 76 #include "ov-uint8.h" |
77 #include "ov-uint16.h" | 77 #include "ov-uint16.h" |
78 #include "ov-uint32.h" | |
78 #include "ov-uint64.h" | 79 #include "ov-uint64.h" |
79 #include "pager.h" | 80 #include "pager.h" |
80 | 81 |
81 typedef __int128_t int128_t; | 82 typedef __int128_t int128_t; |
82 typedef __uint128_t uint128_t; | 83 typedef __uint128_t uint128_t; |
297 | 298 |
298 extern "C" octave_base_value * | 299 extern "C" octave_base_value * |
299 octave_jit_cast_any_uint16 (uint16_t value) | 300 octave_jit_cast_any_uint16 (uint16_t value) |
300 { | 301 { |
301 return new octave_uint16_scalar (value); | 302 return new octave_uint16_scalar (value); |
303 } | |
304 | |
305 extern "C" uint32_t | |
306 octave_jit_cast_uint32_any (octave_base_value *obv) | |
307 { | |
308 uint32_t ret = obv->uint32_scalar_value (); | |
309 obv->release (); | |
310 return ret; | |
311 } | |
312 | |
313 extern "C" octave_base_value * | |
314 octave_jit_cast_any_uint32 (uint32_t value) | |
315 { | |
316 return new octave_uint32_scalar (value); | |
302 } | 317 } |
303 | 318 |
304 extern "C" uint64_t | 319 extern "C" uint64_t |
305 octave_jit_cast_uint64_any (octave_base_value *obv) | 320 octave_jit_cast_uint64_any (octave_base_value *obv) |
306 { | 321 { |
974 return octave_jit_sub_uint16_uint16 (val, 1); | 989 return octave_jit_sub_uint16_uint16 (val, 1); |
975 } | 990 } |
976 | 991 |
977 /************************************************************ | 992 /************************************************************ |
978 * | 993 * |
994 * uint32 related external helper function | |
995 * | |
996 ************************************************************/ | |
997 | |
998 extern "C" uint32_t | |
999 octave_jit_add_uint32_uint32 (uint32_t lhs, uint32_t rhs) | |
1000 { | |
1001 uint32_t res = lhs + rhs; | |
1002 res |= -(res < lhs); | |
1003 | |
1004 return res; | |
1005 } | |
1006 | |
1007 extern "C" uint32_t | |
1008 octave_jit_sub_uint32_uint32 (uint32_t lhs, uint32_t rhs) | |
1009 { | |
1010 uint32_t res = lhs - rhs; | |
1011 res &= -(res <= lhs); | |
1012 | |
1013 return res; | |
1014 } | |
1015 | |
1016 extern "C" uint32_t | |
1017 octave_jit_mul_uint32_uint32 (uint32_t lhs, uint32_t rhs) | |
1018 { | |
1019 uint64_t res = (uint64_t) lhs * (uint64_t) rhs; | |
1020 | |
1021 uint32_t hi = res >> 32; | |
1022 uint32_t lo = res; | |
1023 | |
1024 return lo | -!!hi; | |
1025 } | |
1026 | |
1027 extern "C" uint32_t | |
1028 octave_jit_incr_uint32 (uint32_t val) | |
1029 { | |
1030 return octave_jit_add_uint32_uint32 (val, 1); | |
1031 } | |
1032 | |
1033 extern "C" uint32_t | |
1034 octave_jit_decr_uint32 (uint32_t val) | |
1035 { | |
1036 return octave_jit_sub_uint32_uint32 (val, 1); | |
1037 } | |
1038 | |
1039 /************************************************************ | |
1040 * | |
979 * uint64 related external helper function | 1041 * uint64 related external helper function |
980 * | 1042 * |
981 ************************************************************/ | 1043 ************************************************************/ |
982 | 1044 |
983 extern "C" uint64_t | 1045 extern "C" uint64_t |
1650 llvm::Type *int16__t = llvm::Type::getIntNTy (context, 16); | 1712 llvm::Type *int16__t = llvm::Type::getIntNTy (context, 16); |
1651 llvm::Type *int32__t = llvm::Type::getIntNTy (context, 32); | 1713 llvm::Type *int32__t = llvm::Type::getIntNTy (context, 32); |
1652 llvm::Type *int64__t = llvm::Type::getIntNTy (context, 64); | 1714 llvm::Type *int64__t = llvm::Type::getIntNTy (context, 64); |
1653 llvm::Type *uint8__t = llvm::Type::getIntNTy (context, 8); | 1715 llvm::Type *uint8__t = llvm::Type::getIntNTy (context, 8); |
1654 llvm::Type *uint16__t = llvm::Type::getIntNTy (context, 16); | 1716 llvm::Type *uint16__t = llvm::Type::getIntNTy (context, 16); |
1717 llvm::Type *uint32__t = llvm::Type::getIntNTy (context, 32); | |
1655 llvm::Type *uint64__t = llvm::Type::getIntNTy (context, 64); | 1718 llvm::Type *uint64__t = llvm::Type::getIntNTy (context, 64); |
1656 llvm::Type *bool_t = llvm::Type::getInt1Ty (context); | 1719 llvm::Type *bool_t = llvm::Type::getInt1Ty (context); |
1657 llvm::Type *string_t = llvm::Type::getInt8Ty (context); | 1720 llvm::Type *string_t = llvm::Type::getInt8Ty (context); |
1658 string_t = string_t->getPointerTo (); | 1721 string_t = string_t->getPointerTo (); |
1659 llvm::Type *index_t = llvm::Type::getIntNTy (context, | 1722 llvm::Type *index_t = llvm::Type::getIntNTy (context, |
1706 create_int (32); | 1769 create_int (32); |
1707 create_int (64); | 1770 create_int (64); |
1708 | 1771 |
1709 create_uint (8); | 1772 create_uint (8); |
1710 create_uint (16); | 1773 create_uint (16); |
1774 create_uint (32); | |
1711 create_uint (64); | 1775 create_uint (64); |
1712 | 1776 |
1713 casts.resize (next_id + 1); | 1777 casts.resize (next_id + 1); |
1714 identities.resize (next_id + 1); | 1778 identities.resize (next_id + 1); |
1715 | 1779 |
1807 grab_fn.add_overload (create_identity (intN (16))); | 1871 grab_fn.add_overload (create_identity (intN (16))); |
1808 grab_fn.add_overload (create_identity (intN (32))); | 1872 grab_fn.add_overload (create_identity (intN (32))); |
1809 grab_fn.add_overload (create_identity (intN (64))); | 1873 grab_fn.add_overload (create_identity (intN (64))); |
1810 grab_fn.add_overload (create_identity (uintN (8))); | 1874 grab_fn.add_overload (create_identity (uintN (8))); |
1811 grab_fn.add_overload (create_identity (uintN (16))); | 1875 grab_fn.add_overload (create_identity (uintN (16))); |
1876 grab_fn.add_overload (create_identity (uintN (32))); | |
1812 grab_fn.add_overload (create_identity (uintN (64))); | 1877 grab_fn.add_overload (create_identity (uintN (64))); |
1813 grab_fn.add_overload (create_identity (scalar_ptr)); | 1878 grab_fn.add_overload (create_identity (scalar_ptr)); |
1814 grab_fn.add_overload (create_identity (any_ptr)); | 1879 grab_fn.add_overload (create_identity (any_ptr)); |
1815 grab_fn.add_overload (create_identity (boolean)); | 1880 grab_fn.add_overload (create_identity (boolean)); |
1816 grab_fn.add_overload (create_identity (complex)); | 1881 grab_fn.add_overload (create_identity (complex)); |
1834 destroy_fn.add_overload (create_identity(intN (16))); | 1899 destroy_fn.add_overload (create_identity(intN (16))); |
1835 destroy_fn.add_overload (create_identity(intN (32))); | 1900 destroy_fn.add_overload (create_identity(intN (32))); |
1836 destroy_fn.add_overload (create_identity(intN (64))); | 1901 destroy_fn.add_overload (create_identity(intN (64))); |
1837 destroy_fn.add_overload (create_identity(uintN (8))); | 1902 destroy_fn.add_overload (create_identity(uintN (8))); |
1838 destroy_fn.add_overload (create_identity(uintN (16))); | 1903 destroy_fn.add_overload (create_identity(uintN (16))); |
1904 destroy_fn.add_overload (create_identity(uintN (32))); | |
1839 destroy_fn.add_overload (create_identity(uintN (64))); | 1905 destroy_fn.add_overload (create_identity(uintN (64))); |
1840 destroy_fn.add_overload (create_identity(boolean)); | 1906 destroy_fn.add_overload (create_identity(boolean)); |
1841 destroy_fn.add_overload (create_identity(index)); | 1907 destroy_fn.add_overload (create_identity(index)); |
1842 destroy_fn.add_overload (create_identity(complex)); | 1908 destroy_fn.add_overload (create_identity(complex)); |
1843 | 1909 |
2453 unary_ops[octave_value::op_transpose].add_overload (fn); | 2519 unary_ops[octave_value::op_transpose].add_overload (fn); |
2454 unary_ops[octave_value::op_hermitian].add_overload (fn); | 2520 unary_ops[octave_value::op_hermitian].add_overload (fn); |
2455 | 2521 |
2456 /************************************************************ | 2522 /************************************************************ |
2457 * | 2523 * |
2524 * uint32 related operations | |
2525 * | |
2526 ************************************************************/ | |
2527 | |
2528 // now for binary uint32 operations | |
2529 fn = create_external (JIT_FN (octave_jit_add_uint32_uint32), uintN (32), uintN (32), | |
2530 uintN (32)); | |
2531 binary_ops[octave_value::op_add].add_overload (fn); | |
2532 fn = create_external (JIT_FN (octave_jit_sub_uint32_uint32), uintN (32), uintN (32), | |
2533 uintN (32)); | |
2534 binary_ops[octave_value::op_sub].add_overload (fn); | |
2535 fn = create_external (JIT_FN (octave_jit_mul_uint32_uint32), uintN (32), uintN (32), | |
2536 uintN (32)); | |
2537 binary_ops[octave_value::op_mul].add_overload (fn); | |
2538 binary_ops[octave_value::op_el_mul].add_overload (fn); | |
2539 | |
2540 add_binary_icmp (uintN (32), octave_value::op_lt, llvm::CmpInst::ICMP_ULT); | |
2541 add_binary_icmp (uintN (32), octave_value::op_le, llvm::CmpInst::ICMP_ULE); | |
2542 add_binary_icmp (uintN (32), octave_value::op_eq, llvm::CmpInst::ICMP_EQ); | |
2543 add_binary_icmp (uintN (32), octave_value::op_ge, llvm::CmpInst::ICMP_UGE); | |
2544 add_binary_icmp (uintN (32), octave_value::op_gt, llvm::CmpInst::ICMP_UGT); | |
2545 add_binary_icmp (uintN (32), octave_value::op_ne, llvm::CmpInst::ICMP_NE); | |
2546 | |
2547 // FIXME: saturation divide definition? interpreter convert uint to double, calculate and round. | |
2548 // divide is annoying because it might error | |
2549 // FIXME: Implement div | |
2550 | |
2551 // FIXME: Implement pow | |
2552 | |
2553 // now for unary uint32 operations | |
2554 // FIXME: Impelment not | |
2555 fn = create_external (JIT_FN (octave_jit_incr_uint32), uintN (32), uintN (32)); | |
2556 unary_ops[octave_value::op_incr].add_overload (fn); | |
2557 | |
2558 fn = create_external (JIT_FN (octave_jit_decr_uint32), uintN (32), uintN (32)); | |
2559 unary_ops[octave_value::op_decr].add_overload (fn); | |
2560 | |
2561 fn = create_internal ("octave_jit_uminus", uintN (32), uintN (32)); | |
2562 body = fn.new_block (); | |
2563 builder.SetInsertPoint (body); | |
2564 { | |
2565 llvm::Value *zero = llvm::ConstantInt::get (uint32__t, 0); | |
2566 | |
2567 fn.do_return (builder, zero); | |
2568 } | |
2569 unary_ops[octave_value::op_uminus].add_overload (fn); | |
2570 | |
2571 fn = create_identity (uintN (32)); | |
2572 unary_ops[octave_value::op_uplus].add_overload (fn); | |
2573 unary_ops[octave_value::op_transpose].add_overload (fn); | |
2574 unary_ops[octave_value::op_hermitian].add_overload (fn); | |
2575 | |
2576 /************************************************************ | |
2577 * | |
2458 * uint64 related operations | 2578 * uint64 related operations |
2459 * | 2579 * |
2460 ************************************************************/ | 2580 ************************************************************/ |
2461 | 2581 |
2462 // now for binary uint64 operations | 2582 // now for binary uint64 operations |
2891 casts[intN (16)->type_id ()].stash_name ("(int16)"); | 3011 casts[intN (16)->type_id ()].stash_name ("(int16)"); |
2892 casts[intN (32)->type_id ()].stash_name ("(int32)"); | 3012 casts[intN (32)->type_id ()].stash_name ("(int32)"); |
2893 casts[intN (64)->type_id ()].stash_name ("(int64)"); | 3013 casts[intN (64)->type_id ()].stash_name ("(int64)"); |
2894 casts[uintN (8)->type_id ()].stash_name ("(uint8)"); | 3014 casts[uintN (8)->type_id ()].stash_name ("(uint8)"); |
2895 casts[uintN (16)->type_id ()].stash_name ("(uint16)"); | 3015 casts[uintN (16)->type_id ()].stash_name ("(uint16)"); |
3016 casts[uintN (32)->type_id ()].stash_name ("(uint32)"); | |
2896 casts[uintN (64)->type_id ()].stash_name ("(uint64)"); | 3017 casts[uintN (64)->type_id ()].stash_name ("(uint64)"); |
2897 casts[complex->type_id ()].stash_name ("(complex)"); | 3018 casts[complex->type_id ()].stash_name ("(complex)"); |
2898 casts[matrix->type_id ()].stash_name ("(matrix)"); | 3019 casts[matrix->type_id ()].stash_name ("(matrix)"); |
2899 casts[range->type_id ()].stash_name ("(range)"); | 3020 casts[range->type_id ()].stash_name ("(range)"); |
2900 | 3021 |
2975 casts[any->type_id ()].add_overload (fn); | 3096 casts[any->type_id ()].add_overload (fn); |
2976 | 3097 |
2977 // cast uint16 <- any | 3098 // cast uint16 <- any |
2978 fn = create_external (JIT_FN (octave_jit_cast_uint16_any), uintN (16), any); | 3099 fn = create_external (JIT_FN (octave_jit_cast_uint16_any), uintN (16), any); |
2979 casts[uintN (16)->type_id ()].add_overload (fn); | 3100 casts[uintN (16)->type_id ()].add_overload (fn); |
3101 | |
3102 // cast any <- uint32 | |
3103 fn = create_external (JIT_FN (octave_jit_cast_any_uint32), any, uintN (32)); | |
3104 casts[any->type_id ()].add_overload (fn); | |
3105 | |
3106 // cast uint32 <- any | |
3107 fn = create_external (JIT_FN (octave_jit_cast_uint32_any), uintN (32), any); | |
3108 casts[uintN (32)->type_id ()].add_overload (fn); | |
2980 | 3109 |
2981 // cast any <- uint64 | 3110 // cast any <- uint64 |
2982 fn = create_external (JIT_FN (octave_jit_cast_any_uint64), any, uintN (64)); | 3111 fn = create_external (JIT_FN (octave_jit_cast_any_uint64), any, uintN (64)); |
2983 casts[any->type_id ()].add_overload (fn); | 3112 casts[any->type_id ()].add_overload (fn); |
2984 | 3113 |
3044 casts[uintN (8)->type_id ()].add_overload (fn); | 3173 casts[uintN (8)->type_id ()].add_overload (fn); |
3045 | 3174 |
3046 // cast uint16 <- uint16 | 3175 // cast uint16 <- uint16 |
3047 fn = create_identity (uintN (16)); | 3176 fn = create_identity (uintN (16)); |
3048 casts[uintN (16)->type_id ()].add_overload (fn); | 3177 casts[uintN (16)->type_id ()].add_overload (fn); |
3178 | |
3179 // cast uint32 <- uint32 | |
3180 fn = create_identity (uintN (32)); | |
3181 casts[uintN (32)->type_id ()].add_overload (fn); | |
3049 | 3182 |
3050 // cast uint64 <- uint64 | 3183 // cast uint64 <- uint64 |
3051 fn = create_identity (uintN (64)); | 3184 fn = create_identity (uintN (64)); |
3052 casts[uintN (64)->type_id ()].add_overload (fn); | 3185 casts[uintN (64)->type_id ()].add_overload (fn); |
3053 | 3186 |
3537 if (ov.is_uint16_type()) | 3670 if (ov.is_uint16_type()) |
3538 { | 3671 { |
3539 return uintN (16); | 3672 return uintN (16); |
3540 } | 3673 } |
3541 | 3674 |
3675 if (ov.is_uint32_type()) | |
3676 { | |
3677 return uintN (32); | |
3678 } | |
3679 | |
3542 if (ov.is_uint64_type()) | 3680 if (ov.is_uint64_type()) |
3543 { | 3681 { |
3544 return uintN (64); | 3682 return uintN (64); |
3545 } | 3683 } |
3546 | 3684 |