attempt to simplify logic

This commit is contained in:
Folkert 2023-06-06 18:45:44 +02:00
parent 2d9fdf0338
commit 9955fe581b
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C

View file

@ -1921,19 +1921,7 @@ fn tag_pointer_set_tag_id<'ctx>(
// we only have 3 bits, so can encode only 0..7 (or on 32-bit targets, 2 bits to encode 0..3)
debug_assert!((tag_id as u32) < env.target_info.ptr_width() as u32);
let (_, tag_id_bits_mask) = tag_pointer_tag_id_bits_and_mask(env.target_info);
let ptr_int = env.ptr_int();
let as_int = env.builder.build_ptr_to_int(pointer, ptr_int, "to_int");
let mask = env.ptr_int().const_int(tag_id_bits_mask, false);
let masked = env.builder.build_and(as_int, mask, "masked");
let tag_id_intval = ptr_int.const_int(tag_id as u64, false);
let index = env.builder.build_int_sub(tag_id_intval, masked, "index");
let tag_id_intval = env.ptr_int().const_int(tag_id as u64, false);
let cast_pointer = env.builder.build_pointer_cast(
pointer,
@ -1941,7 +1929,11 @@ fn tag_pointer_set_tag_id<'ctx>(
"cast_to_i8_ptr",
);
let indexed_pointer = unsafe { env.builder.build_gep(cast_pointer, &[index], "new_ptr") };
// NOTE: assumes the lower bits of `cast_pointer` are all 0
let indexed_pointer = unsafe {
env.builder
.build_in_bounds_gep(cast_pointer, &[tag_id_intval], "indexed_pointer")
};
env.builder
.build_pointer_cast(indexed_pointer, pointer.get_type(), "cast_from_i8_ptr")
@ -1974,19 +1966,17 @@ pub fn tag_pointer_clear_tag_id<'ctx>(
env: &Env<'_, 'ctx, '_>,
pointer: PointerValue<'ctx>,
) -> PointerValue<'ctx> {
let ptr_int = env.ptr_int();
let (_, tag_id_bits_mask) = tag_pointer_tag_id_bits_and_mask(env.target_info);
let as_int = env.builder.build_ptr_to_int(pointer, ptr_int, "to_int");
let as_int = env
.builder
.build_ptr_to_int(pointer, env.ptr_int(), "to_int");
let mask = env.ptr_int().const_int(tag_id_bits_mask, false);
let masked = env.builder.build_and(as_int, mask, "masked");
let current_tag_id = env.builder.build_and(as_int, mask, "masked");
let zero = env.ptr_int().const_zero();
let index = env.builder.build_int_sub(zero, masked, "index");
let index = env.builder.build_int_neg(current_tag_id, "index");
let cast_pointer = env.builder.build_pointer_cast(
pointer,