Skip to content

Commit 1b6bd3d

Browse files
committed
Introduce codegen_iconst_u128
1 parent b8574f7 commit 1b6bd3d

5 files changed

Lines changed: 19 additions & 52 deletions

File tree

src/common.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ fn clif_pair_type_from_ty<'tcx>(
101101
})
102102
}
103103

104+
pub(crate) fn codegen_iconst_u128(bcx: &mut FunctionBuilder<'_>, val: u128) -> Value {
105+
let lsb = bcx.ins().iconst(types::I64, (val as u64).cast_signed());
106+
let msb = bcx.ins().iconst(types::I64, ((val >> 64) as u64).cast_signed());
107+
bcx.ins().iconcat(lsb, msb)
108+
}
109+
104110
pub(crate) fn codegen_icmp_imm(
105111
fx: &mut FunctionCx<'_, '_, '_>,
106112
intcc: IntCC,
@@ -172,22 +178,13 @@ pub(crate) fn type_min_max_value(
172178

173179
if ty == types::I128 {
174180
if signed {
175-
let min = i128::MIN as u128;
176-
let min_lsb = bcx.ins().iconst(types::I64, min as u64 as i64);
177-
let min_msb = bcx.ins().iconst(types::I64, (min >> 64) as u64 as i64);
178-
let min = bcx.ins().iconcat(min_lsb, min_msb);
179-
180-
let max = i128::MAX as u128;
181-
let max_lsb = bcx.ins().iconst(types::I64, max as u64 as i64);
182-
let max_msb = bcx.ins().iconst(types::I64, (max >> 64) as u64 as i64);
183-
let max = bcx.ins().iconcat(max_lsb, max_msb);
184-
181+
let min = codegen_iconst_u128(bcx, i128::MIN.cast_unsigned());
182+
let max = codegen_iconst_u128(bcx, i128::MAX.cast_unsigned());
185183
return (min, max);
186184
} else {
187-
let min_half = bcx.ins().iconst(types::I64, 0);
188-
let min = bcx.ins().iconcat(min_half, min_half);
185+
let min = type_zero_value(bcx, types::I128);
189186

190-
let max_half = bcx.ins().iconst(types::I64, u64::MAX as i64);
187+
let max_half = bcx.ins().iconst(types::I64, u64::MAX.cast_signed());
191188
let max = bcx.ins().iconcat(max_half, max_half);
192189

193190
return (min, max);

src/constant.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,7 @@ pub(crate) fn codegen_const_value<'tcx>(
119119
2 => fx.bcx.ins().iconst(types::I16, raw_val as i64),
120120
4 => fx.bcx.ins().iconst(types::I32, raw_val as i64),
121121
8 => fx.bcx.ins().iconst(types::I64, raw_val as i64),
122-
16 => {
123-
let lsb = fx.bcx.ins().iconst(types::I64, raw_val as u64 as i64);
124-
let msb =
125-
fx.bcx.ins().iconst(types::I64, (raw_val >> 64) as u64 as i64);
126-
fx.bcx.ins().iconcat(lsb, msb)
127-
}
122+
16 => codegen_iconst_u128(&mut fx.bcx, raw_val),
128123
_ => unreachable!(),
129124
};
130125

src/discriminant.rs

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ pub(crate) fn codegen_set_discriminant<'tcx>(
3232
let to = layout.ty.discriminant_for_variant(fx.tcx, variant_index).unwrap().val;
3333
let to = match ptr.layout().ty.kind() {
3434
ty::Uint(UintTy::U128) | ty::Int(IntTy::I128) => {
35-
let lsb = fx.bcx.ins().iconst(types::I64, to as u64 as i64);
36-
let msb = fx.bcx.ins().iconst(types::I64, (to >> 64) as u64 as i64);
37-
fx.bcx.ins().iconcat(lsb, msb)
35+
codegen_iconst_u128(&mut fx.bcx, to)
3836
}
3937
ty::Uint(_) | ty::Int(_) => {
4038
let clif_ty = fx.clif_type(ptr.layout().ty).unwrap();
@@ -58,12 +56,7 @@ pub(crate) fn codegen_set_discriminant<'tcx>(
5856
let niche_value = variant_index.as_u32() - niche_variants.start().as_u32();
5957
let niche_value = (niche_value as u128).wrapping_add(niche_start);
6058
let niche_value = match niche_type {
61-
types::I128 => {
62-
let lsb = fx.bcx.ins().iconst(types::I64, niche_value as u64 as i64);
63-
let msb =
64-
fx.bcx.ins().iconst(types::I64, (niche_value >> 64) as u64 as i64);
65-
fx.bcx.ins().iconcat(lsb, msb)
66-
}
59+
types::I128 => codegen_iconst_u128(&mut fx.bcx, niche_value),
6760
ty => fx.bcx.ins().iconst(ty, niche_value as i64),
6861
};
6962
let niche_llval = CValue::by_val(niche_value, niche.layout());
@@ -95,9 +88,7 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
9588

9689
let val = match dest_layout.ty.kind() {
9790
ty::Uint(UintTy::U128) | ty::Int(IntTy::I128) => {
98-
let lsb = fx.bcx.ins().iconst(types::I64, discr_val as u64 as i64);
99-
let msb = fx.bcx.ins().iconst(types::I64, (discr_val >> 64) as u64 as i64);
100-
fx.bcx.ins().iconcat(lsb, msb)
91+
codegen_iconst_u128(&mut fx.bcx, discr_val)
10192
}
10293
ty::Uint(_) | ty::Int(_) => {
10394
let clif_ty = fx.clif_type(dest_layout.ty).unwrap();
@@ -168,12 +159,7 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
168159
// The special cases don't apply, so we'll have to go with
169160
// the general algorithm.
170161
let niche_start = match fx.bcx.func.dfg.value_type(tag) {
171-
types::I128 => {
172-
let lsb = fx.bcx.ins().iconst(types::I64, niche_start as u64 as i64);
173-
let msb =
174-
fx.bcx.ins().iconst(types::I64, (niche_start >> 64) as u64 as i64);
175-
fx.bcx.ins().iconcat(lsb, msb)
176-
}
162+
types::I128 => codegen_iconst_u128(&mut fx.bcx, niche_start),
177163
ty => fx.bcx.ins().iconst(ty, niche_start as i64),
178164
};
179165
let relative_discr = fx.bcx.ins().isub(tag, niche_start);
@@ -191,21 +177,14 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
191177
tagged_discr
192178
} else {
193179
let delta = match cast_to {
194-
types::I128 => {
195-
let lsb = fx.bcx.ins().iconst(types::I64, delta as u64 as i64);
196-
let msb = fx.bcx.ins().iconst(types::I64, (delta >> 64) as u64 as i64);
197-
fx.bcx.ins().iconcat(lsb, msb)
198-
}
180+
types::I128 => codegen_iconst_u128(&mut fx.bcx, delta),
199181
ty => fx.bcx.ins().iconst(ty, delta as i64),
200182
};
201183
fx.bcx.ins().iadd(tagged_discr, delta)
202184
};
203185

204186
let untagged_variant = if cast_to == types::I128 {
205-
let zero = fx.bcx.ins().iconst(types::I64, 0);
206-
let untagged_variant =
207-
fx.bcx.ins().iconst(types::I64, i64::from(untagged_variant.as_u32()));
208-
fx.bcx.ins().iconcat(untagged_variant, zero)
187+
codegen_iconst_u128(&mut fx.bcx, u128::from(untagged_variant.as_u32()))
209188
} else {
210189
fx.bcx.ins().iconst(cast_to, i64::from(untagged_variant.as_u32()))
211190
};

src/intrinsics/llvm_x86.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,7 @@ pub(super) fn codegen_x86_llvm_intrinsic_call<'tcx>(
388388
let high_or_low = fx.bcx.ins().band_imm(control, 0b0001);
389389
let is_zero = fx.bcx.ins().band_imm(control, 0b1000);
390390

391-
let zero = fx.bcx.ins().iconst(types::I64, 0);
392-
let zero = fx.bcx.ins().iconcat(zero, zero);
391+
let zero = type_zero_value(&mut fx.bcx, types::I128);
393392

394393
let res_a = fx.bcx.ins().select(high_or_low, a_high, a_low);
395394
let res_b = fx.bcx.ins().select(high_or_low, b_high, b_low);

src/value_and_place.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,7 @@ impl<'tcx> CValue<'tcx> {
296296

297297
let val = match layout.ty.kind() {
298298
ty::Uint(UintTy::U128) | ty::Int(IntTy::I128) => {
299-
let const_val = const_val.to_bits(layout.size);
300-
let lsb = fx.bcx.ins().iconst(types::I64, const_val as u64 as i64);
301-
let msb = fx.bcx.ins().iconst(types::I64, (const_val >> 64) as u64 as i64);
302-
fx.bcx.ins().iconcat(lsb, msb)
299+
codegen_iconst_u128(&mut fx.bcx, const_val.to_bits(layout.size))
303300
}
304301
ty::Bool
305302
| ty::Char

0 commit comments

Comments
 (0)