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