Skip to content

Commit 0311202

Browse files
committed
Implement _addcarry_u32 and _subborrow_u32
1 parent 6b141f3 commit 0311202

File tree

1 file changed

+8
-16
lines changed

1 file changed

+8
-16
lines changed

src/intrinsics/llvm_x86.rs

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,13 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
321321
let dest = CPlace::for_ptr(Pointer::new(mem_addr), a.layout());
322322
dest.write_cvalue(fx, a);
323323
}
324-
"llvm.x86.addcarry.64" => {
324+
"llvm.x86.addcarry.32" | "llvm.x86.addcarry.64" => {
325325
intrinsic_args!(fx, args => (c_in, a, b); intrinsic);
326326
let c_in = c_in.load_scalar(fx);
327327

328328
llvm_add_sub(fx, BinOp::Add, ret, c_in, a, b);
329329
}
330-
"llvm.x86.subborrow.64" => {
330+
"llvm.x86.subborrow.32" | "llvm.x86.subborrow.64" => {
331331
intrinsic_args!(fx, args => (b_in, a, b); intrinsic);
332332
let b_in = b_in.load_scalar(fx);
333333

@@ -361,32 +361,24 @@ fn llvm_add_sub<'tcx>(
361361
a: CValue<'tcx>,
362362
b: CValue<'tcx>,
363363
) {
364-
assert_eq!(
365-
a.layout().ty,
366-
fx.tcx.types.u64,
367-
"llvm.x86.addcarry.64/llvm.x86.subborrow.64 second operand must be u64"
368-
);
369-
assert_eq!(
370-
b.layout().ty,
371-
fx.tcx.types.u64,
372-
"llvm.x86.addcarry.64/llvm.x86.subborrow.64 third operand must be u64"
373-
);
364+
assert_eq!(a.layout().ty, b.layout().ty);
374365

375366
// c + carry -> c + first intermediate carry or borrow respectively
376367
let int0 = crate::num::codegen_checked_int_binop(fx, bin_op, a, b);
377368
let c = int0.value_field(fx, FieldIdx::new(0));
378369
let cb0 = int0.value_field(fx, FieldIdx::new(1)).load_scalar(fx);
379370

380371
// c + carry -> c + second intermediate carry or borrow respectively
381-
let cb_in_as_u64 = fx.bcx.ins().uextend(types::I64, cb_in);
382-
let cb_in_as_u64 = CValue::by_val(cb_in_as_u64, fx.layout_of(fx.tcx.types.u64));
383-
let int1 = crate::num::codegen_checked_int_binop(fx, bin_op, c, cb_in_as_u64);
372+
let clif_ty = fx.clif_type(a.layout().ty).unwrap();
373+
let cb_in_as_int = fx.bcx.ins().uextend(clif_ty, cb_in);
374+
let cb_in_as_int = CValue::by_val(cb_in_as_int, fx.layout_of(a.layout().ty));
375+
let int1 = crate::num::codegen_checked_int_binop(fx, bin_op, c, cb_in_as_int);
384376
let (c, cb1) = int1.load_scalar_pair(fx);
385377

386378
// carry0 | carry1 -> carry or borrow respectively
387379
let cb_out = fx.bcx.ins().bor(cb0, cb1);
388380

389-
let layout = fx.layout_of(fx.tcx.mk_tup(&[fx.tcx.types.u8, fx.tcx.types.u64]));
381+
let layout = fx.layout_of(fx.tcx.mk_tup(&[fx.tcx.types.u8, a.layout().ty]));
390382
let val = CValue::by_val_pair(cb_out, c, layout);
391383
ret.write_cvalue(fx, val);
392384
}

0 commit comments

Comments
 (0)