| ... | ... | @@ -7742,9 +7742,9 @@ ZigType *make_int_type(CodeGen *g, bool is_signed, uint32_t size_in_bits) { |
| 7742 | 7742 | return entry; |
| 7743 | 7743 | } |
| 7744 | 7744 | |
| 7745 | | uint32_t type_id_hash(TypeId x) { |
| 7746 | | uint32_t hash = hash_combine(HASH_INIT, &x.id); |
| 7747 | | switch (x.id) { |
| 7745 | uint32_t type_id_hash(TypeId const *x) { |
| 7746 | uint32_t hash = hash_combine(HASH_INIT, &x->id); |
| 7747 | switch (x->id) { |
| 7748 | 7748 | case ZigTypeIdInvalid: |
| 7749 | 7749 | case ZigTypeIdOpaque: |
| 7750 | 7750 | case ZigTypeIdMetaType: |
| ... | ... | @@ -7768,46 +7768,50 @@ uint32_t type_id_hash(TypeId x) { |
| 7768 | 7768 | case ZigTypeIdAnyFrame: |
| 7769 | 7769 | zig_unreachable(); |
| 7770 | 7770 | case ZigTypeIdErrorUnion: |
| 7771 | | hash = hash_combine(hash, &x.data.error_union.err_set_type); |
| 7772 | | hash = hash_combine(hash, &x.data.error_union.payload_type); |
| 7771 | hash = hash_combine(hash, &x->data.error_union.err_set_type); |
| 7772 | hash = hash_combine(hash, &x->data.error_union.payload_type); |
| 7773 | 7773 | return hash; |
| 7774 | 7774 | case ZigTypeIdPointer: |
| 7775 | | hash = hash_combine(hash, &x.data.pointer.child_type); |
| 7776 | | hash = hash_combine(hash, &x.data.pointer.ptr_len); |
| 7777 | | hash = hash_combine(hash, &x.data.pointer.is_const); |
| 7778 | | hash = hash_combine(hash, &x.data.pointer.is_volatile); |
| 7779 | | hash = hash_combine(hash, &x.data.pointer.allow_zero); |
| 7780 | | hash = hash_combine(hash, &x.data.pointer.alignment); |
| 7781 | | hash = hash_combine(hash, &x.data.pointer.bit_offset_in_host); |
| 7782 | | hash = hash_combine(hash, &x.data.pointer.vector_index); |
| 7783 | | hash = hash_combine(hash, &x.data.pointer.host_int_bytes); |
| 7784 | | if (x.data.pointer.sentinel != nullptr) { |
| 7785 | | hash = hash_combine_const_val(hash, x.data.pointer.sentinel); |
| 7775 | hash = hash_combine(hash, &x->data.pointer.child_type); |
| 7776 | hash = hash_combine(hash, &x->data.pointer.ptr_len); |
| 7777 | hash = hash_combine(hash, &x->data.pointer.is_const); |
| 7778 | hash = hash_combine(hash, &x->data.pointer.is_volatile); |
| 7779 | hash = hash_combine(hash, &x->data.pointer.allow_zero); |
| 7780 | hash = hash_combine(hash, &x->data.pointer.alignment); |
| 7781 | hash = hash_combine(hash, &x->data.pointer.bit_offset_in_host); |
| 7782 | hash = hash_combine(hash, &x->data.pointer.vector_index); |
| 7783 | hash = hash_combine(hash, &x->data.pointer.host_int_bytes); |
| 7784 | if (x->data.pointer.sentinel != nullptr) { |
| 7785 | hash = hash_combine_const_val(hash, x->data.pointer.sentinel); |
| 7786 | } |
| 7787 | if (x->data.pointer.inferred_struct_field) { |
| 7788 | hash = hash_combine(hash, &x->data.pointer.inferred_struct_field->inferred_struct_type); |
| 7789 | hash = hash_combine_buf(hash, x->data.pointer.inferred_struct_field->field_name); |
| 7786 | 7790 | } |
| 7787 | 7791 | return hash; |
| 7788 | 7792 | case ZigTypeIdArray: |
| 7789 | | hash = hash_combine(hash, &x.data.array.child_type); |
| 7790 | | hash = hash_combine(hash, &x.data.array.size); |
| 7791 | | if (x.data.array.sentinel != nullptr) { |
| 7792 | | hash = hash_combine_const_val(hash, x.data.array.sentinel); |
| 7793 | hash = hash_combine(hash, &x->data.array.child_type); |
| 7794 | hash = hash_combine(hash, &x->data.array.size); |
| 7795 | if (x->data.array.sentinel != nullptr) { |
| 7796 | hash = hash_combine_const_val(hash, x->data.array.sentinel); |
| 7793 | 7797 | } |
| 7794 | 7798 | return hash; |
| 7795 | 7799 | case ZigTypeIdInt: |
| 7796 | | hash = hash_combine(hash, &x.data.integer.is_signed); |
| 7797 | | hash = hash_combine(hash, &x.data.integer.bit_count); |
| 7800 | hash = hash_combine(hash, &x->data.integer.is_signed); |
| 7801 | hash = hash_combine(hash, &x->data.integer.bit_count); |
| 7798 | 7802 | return hash; |
| 7799 | 7803 | case ZigTypeIdVector: |
| 7800 | | hash = hash_combine(hash, &x.data.vector.elem_type); |
| 7801 | | hash = hash_combine(hash, &x.data.vector.len); |
| 7804 | hash = hash_combine(hash, &x->data.vector.elem_type); |
| 7805 | hash = hash_combine(hash, &x->data.vector.len); |
| 7802 | 7806 | return hash; |
| 7803 | 7807 | } |
| 7804 | 7808 | zig_unreachable(); |
| 7805 | 7809 | } |
| 7806 | 7810 | |
| 7807 | | bool type_id_eql(TypeId a, TypeId b) { |
| 7808 | | if (a.id != b.id) |
| 7811 | bool type_id_eql(TypeId const *a, TypeId const *b) { |
| 7812 | if (a->id != b->id) |
| 7809 | 7813 | return false; |
| 7810 | | switch (a.id) { |
| 7814 | switch (a->id) { |
| 7811 | 7815 | case ZigTypeIdInvalid: |
| 7812 | 7816 | case ZigTypeIdMetaType: |
| 7813 | 7817 | case ZigTypeIdVoid: |
| ... | ... | @@ -7831,107 +7835,107 @@ bool type_id_eql(TypeId a, TypeId b) { |
| 7831 | 7835 | case ZigTypeIdAnyFrame: |
| 7832 | 7836 | zig_unreachable(); |
| 7833 | 7837 | case ZigTypeIdErrorUnion: |
| 7834 | | return a.data.error_union.err_set_type == b.data.error_union.err_set_type && |
| 7835 | | a.data.error_union.payload_type == b.data.error_union.payload_type; |
| 7838 | return a->data.error_union.err_set_type == b->data.error_union.err_set_type && |
| 7839 | a->data.error_union.payload_type == b->data.error_union.payload_type; |
| 7836 | 7840 | |
| 7837 | 7841 | case ZigTypeIdPointer: |
| 7838 | | return a.data.pointer.child_type == b.data.pointer.child_type && |
| 7839 | | a.data.pointer.ptr_len == b.data.pointer.ptr_len && |
| 7840 | | a.data.pointer.is_const == b.data.pointer.is_const && |
| 7841 | | a.data.pointer.is_volatile == b.data.pointer.is_volatile && |
| 7842 | | a.data.pointer.allow_zero == b.data.pointer.allow_zero && |
| 7843 | | a.data.pointer.alignment == b.data.pointer.alignment && |
| 7844 | | a.data.pointer.bit_offset_in_host == b.data.pointer.bit_offset_in_host && |
| 7845 | | a.data.pointer.vector_index == b.data.pointer.vector_index && |
| 7846 | | a.data.pointer.host_int_bytes == b.data.pointer.host_int_bytes && |
| 7842 | return a->data.pointer.child_type == b->data.pointer.child_type && |
| 7843 | a->data.pointer.ptr_len == b->data.pointer.ptr_len && |
| 7844 | a->data.pointer.is_const == b->data.pointer.is_const && |
| 7845 | a->data.pointer.is_volatile == b->data.pointer.is_volatile && |
| 7846 | a->data.pointer.allow_zero == b->data.pointer.allow_zero && |
| 7847 | a->data.pointer.alignment == b->data.pointer.alignment && |
| 7848 | a->data.pointer.bit_offset_in_host == b->data.pointer.bit_offset_in_host && |
| 7849 | a->data.pointer.vector_index == b->data.pointer.vector_index && |
| 7850 | a->data.pointer.host_int_bytes == b->data.pointer.host_int_bytes && |
| 7847 | 7851 | ( |
| 7848 | | a.data.pointer.sentinel == b.data.pointer.sentinel || |
| 7849 | | (a.data.pointer.sentinel != nullptr && b.data.pointer.sentinel != nullptr && |
| 7850 | | const_values_equal(a.data.pointer.codegen, a.data.pointer.sentinel, b.data.pointer.sentinel)) |
| 7852 | a->data.pointer.sentinel == b->data.pointer.sentinel || |
| 7853 | (a->data.pointer.sentinel != nullptr && b->data.pointer.sentinel != nullptr && |
| 7854 | const_values_equal(a->data.pointer.codegen, a->data.pointer.sentinel, b->data.pointer.sentinel)) |
| 7851 | 7855 | ) && |
| 7852 | 7856 | ( |
| 7853 | | a.data.pointer.inferred_struct_field == b.data.pointer.inferred_struct_field || |
| 7854 | | (a.data.pointer.inferred_struct_field != nullptr && |
| 7855 | | b.data.pointer.inferred_struct_field != nullptr && |
| 7856 | | a.data.pointer.inferred_struct_field->inferred_struct_type == |
| 7857 | | b.data.pointer.inferred_struct_field->inferred_struct_type && |
| 7858 | | buf_eql_buf(a.data.pointer.inferred_struct_field->field_name, |
| 7859 | | b.data.pointer.inferred_struct_field->field_name)) |
| 7857 | a->data.pointer.inferred_struct_field == b->data.pointer.inferred_struct_field || |
| 7858 | (a->data.pointer.inferred_struct_field != nullptr && |
| 7859 | b->data.pointer.inferred_struct_field != nullptr && |
| 7860 | a->data.pointer.inferred_struct_field->inferred_struct_type == |
| 7861 | b->data.pointer.inferred_struct_field->inferred_struct_type && |
| 7862 | buf_eql_buf(a->data.pointer.inferred_struct_field->field_name, |
| 7863 | b->data.pointer.inferred_struct_field->field_name)) |
| 7860 | 7864 | ); |
| 7861 | 7865 | case ZigTypeIdArray: |
| 7862 | | return a.data.array.child_type == b.data.array.child_type && |
| 7863 | | a.data.array.size == b.data.array.size && |
| 7866 | return a->data.array.child_type == b->data.array.child_type && |
| 7867 | a->data.array.size == b->data.array.size && |
| 7864 | 7868 | ( |
| 7865 | | a.data.array.sentinel == b.data.array.sentinel || |
| 7866 | | (a.data.array.sentinel != nullptr && b.data.array.sentinel != nullptr && |
| 7867 | | const_values_equal(a.data.array.codegen, a.data.array.sentinel, b.data.array.sentinel)) |
| 7869 | a->data.array.sentinel == b->data.array.sentinel || |
| 7870 | (a->data.array.sentinel != nullptr && b->data.array.sentinel != nullptr && |
| 7871 | const_values_equal(a->data.array.codegen, a->data.array.sentinel, b->data.array.sentinel)) |
| 7868 | 7872 | ); |
| 7869 | 7873 | case ZigTypeIdInt: |
| 7870 | | return a.data.integer.is_signed == b.data.integer.is_signed && |
| 7871 | | a.data.integer.bit_count == b.data.integer.bit_count; |
| 7874 | return a->data.integer.is_signed == b->data.integer.is_signed && |
| 7875 | a->data.integer.bit_count == b->data.integer.bit_count; |
| 7872 | 7876 | case ZigTypeIdVector: |
| 7873 | | return a.data.vector.elem_type == b.data.vector.elem_type && |
| 7874 | | a.data.vector.len == b.data.vector.len; |
| 7877 | return a->data.vector.elem_type == b->data.vector.elem_type && |
| 7878 | a->data.vector.len == b->data.vector.len; |
| 7875 | 7879 | } |
| 7876 | 7880 | zig_unreachable(); |
| 7877 | 7881 | } |
| 7878 | 7882 | |
| 7879 | | uint32_t zig_llvm_fn_key_hash(ZigLLVMFnKey x) { |
| 7880 | | switch (x.id) { |
| 7883 | uint32_t zig_llvm_fn_key_hash(ZigLLVMFnKey const *x) { |
| 7884 | switch (x->id) { |
| 7881 | 7885 | case ZigLLVMFnIdCtz: |
| 7882 | | return (uint32_t)(x.data.ctz.bit_count) * (uint32_t)810453934; |
| 7886 | return (uint32_t)(x->data.ctz.bit_count) * (uint32_t)810453934; |
| 7883 | 7887 | case ZigLLVMFnIdClz: |
| 7884 | | return (uint32_t)(x.data.clz.bit_count) * (uint32_t)2428952817; |
| 7888 | return (uint32_t)(x->data.clz.bit_count) * (uint32_t)2428952817; |
| 7885 | 7889 | case ZigLLVMFnIdPopCount: |
| 7886 | | return (uint32_t)(x.data.clz.bit_count) * (uint32_t)101195049; |
| 7890 | return (uint32_t)(x->data.clz.bit_count) * (uint32_t)101195049; |
| 7887 | 7891 | case ZigLLVMFnIdFloatOp: |
| 7888 | | return (uint32_t)(x.data.floating.bit_count) * ((uint32_t)x.id + 1025) + |
| 7889 | | (uint32_t)(x.data.floating.vector_len) * (((uint32_t)x.id << 5) + 1025) + |
| 7890 | | (uint32_t)(x.data.floating.op) * (uint32_t)43789879; |
| 7892 | return (uint32_t)(x->data.floating.bit_count) * ((uint32_t)x->id + 1025) + |
| 7893 | (uint32_t)(x->data.floating.vector_len) * (((uint32_t)x->id << 5) + 1025) + |
| 7894 | (uint32_t)(x->data.floating.op) * (uint32_t)43789879; |
| 7891 | 7895 | case ZigLLVMFnIdFMA: |
| 7892 | | return (uint32_t)(x.data.floating.bit_count) * ((uint32_t)x.id + 1025) + |
| 7893 | | (uint32_t)(x.data.floating.vector_len) * (((uint32_t)x.id << 5) + 1025); |
| 7896 | return (uint32_t)(x->data.floating.bit_count) * ((uint32_t)x->id + 1025) + |
| 7897 | (uint32_t)(x->data.floating.vector_len) * (((uint32_t)x->id << 5) + 1025); |
| 7894 | 7898 | case ZigLLVMFnIdBswap: |
| 7895 | | return (uint32_t)(x.data.bswap.bit_count) * ((uint32_t)3661994335) + |
| 7896 | | (uint32_t)(x.data.bswap.vector_len) * (((uint32_t)x.id << 5) + 1025); |
| 7899 | return (uint32_t)(x->data.bswap.bit_count) * ((uint32_t)3661994335) + |
| 7900 | (uint32_t)(x->data.bswap.vector_len) * (((uint32_t)x->id << 5) + 1025); |
| 7897 | 7901 | case ZigLLVMFnIdBitReverse: |
| 7898 | | return (uint32_t)(x.data.bit_reverse.bit_count) * (uint32_t)2621398431; |
| 7902 | return (uint32_t)(x->data.bit_reverse.bit_count) * (uint32_t)2621398431; |
| 7899 | 7903 | case ZigLLVMFnIdOverflowArithmetic: |
| 7900 | | return ((uint32_t)(x.data.overflow_arithmetic.bit_count) * 87135777) + |
| 7901 | | ((uint32_t)(x.data.overflow_arithmetic.add_sub_mul) * 31640542) + |
| 7902 | | ((uint32_t)(x.data.overflow_arithmetic.is_signed) ? 1062315172 : 314955820) + |
| 7903 | | x.data.overflow_arithmetic.vector_len * 1435156945; |
| 7904 | return ((uint32_t)(x->data.overflow_arithmetic.bit_count) * 87135777) + |
| 7905 | ((uint32_t)(x->data.overflow_arithmetic.add_sub_mul) * 31640542) + |
| 7906 | ((uint32_t)(x->data.overflow_arithmetic.is_signed) ? 1062315172 : 314955820) + |
| 7907 | x->data.overflow_arithmetic.vector_len * 1435156945; |
| 7904 | 7908 | } |
| 7905 | 7909 | zig_unreachable(); |
| 7906 | 7910 | } |
| 7907 | 7911 | |
| 7908 | | bool zig_llvm_fn_key_eql(ZigLLVMFnKey a, ZigLLVMFnKey b) { |
| 7909 | | if (a.id != b.id) |
| 7912 | bool zig_llvm_fn_key_eql(ZigLLVMFnKey const *a, ZigLLVMFnKey const *b) { |
| 7913 | if (a->id != b->id) |
| 7910 | 7914 | return false; |
| 7911 | | switch (a.id) { |
| 7915 | switch (a->id) { |
| 7912 | 7916 | case ZigLLVMFnIdCtz: |
| 7913 | | return a.data.ctz.bit_count == b.data.ctz.bit_count; |
| 7917 | return a->data.ctz.bit_count == b->data.ctz.bit_count; |
| 7914 | 7918 | case ZigLLVMFnIdClz: |
| 7915 | | return a.data.clz.bit_count == b.data.clz.bit_count; |
| 7919 | return a->data.clz.bit_count == b->data.clz.bit_count; |
| 7916 | 7920 | case ZigLLVMFnIdPopCount: |
| 7917 | | return a.data.pop_count.bit_count == b.data.pop_count.bit_count; |
| 7921 | return a->data.pop_count.bit_count == b->data.pop_count.bit_count; |
| 7918 | 7922 | case ZigLLVMFnIdBswap: |
| 7919 | | return a.data.bswap.bit_count == b.data.bswap.bit_count && |
| 7920 | | a.data.bswap.vector_len == b.data.bswap.vector_len; |
| 7923 | return a->data.bswap.bit_count == b->data.bswap.bit_count && |
| 7924 | a->data.bswap.vector_len == b->data.bswap.vector_len; |
| 7921 | 7925 | case ZigLLVMFnIdBitReverse: |
| 7922 | | return a.data.bit_reverse.bit_count == b.data.bit_reverse.bit_count; |
| 7926 | return a->data.bit_reverse.bit_count == b->data.bit_reverse.bit_count; |
| 7923 | 7927 | case ZigLLVMFnIdFloatOp: |
| 7924 | | return a.data.floating.bit_count == b.data.floating.bit_count && |
| 7925 | | a.data.floating.vector_len == b.data.floating.vector_len && |
| 7926 | | a.data.floating.op == b.data.floating.op; |
| 7928 | return a->data.floating.bit_count == b->data.floating.bit_count && |
| 7929 | a->data.floating.vector_len == b->data.floating.vector_len && |
| 7930 | a->data.floating.op == b->data.floating.op; |
| 7927 | 7931 | case ZigLLVMFnIdFMA: |
| 7928 | | return a.data.floating.bit_count == b.data.floating.bit_count && |
| 7929 | | a.data.floating.vector_len == b.data.floating.vector_len; |
| 7932 | return a->data.floating.bit_count == b->data.floating.bit_count && |
| 7933 | a->data.floating.vector_len == b->data.floating.vector_len; |
| 7930 | 7934 | case ZigLLVMFnIdOverflowArithmetic: |
| 7931 | | return (a.data.overflow_arithmetic.bit_count == b.data.overflow_arithmetic.bit_count) && |
| 7932 | | (a.data.overflow_arithmetic.add_sub_mul == b.data.overflow_arithmetic.add_sub_mul) && |
| 7933 | | (a.data.overflow_arithmetic.is_signed == b.data.overflow_arithmetic.is_signed) && |
| 7934 | | (a.data.overflow_arithmetic.vector_len == b.data.overflow_arithmetic.vector_len); |
| 7935 | return (a->data.overflow_arithmetic.bit_count == b->data.overflow_arithmetic.bit_count) && |
| 7936 | (a->data.overflow_arithmetic.add_sub_mul == b->data.overflow_arithmetic.add_sub_mul) && |
| 7937 | (a->data.overflow_arithmetic.is_signed == b->data.overflow_arithmetic.is_signed) && |
| 7938 | (a->data.overflow_arithmetic.vector_len == b->data.overflow_arithmetic.vector_len); |
| 7935 | 7939 | } |
| 7936 | 7940 | zig_unreachable(); |
| 7937 | 7941 | } |