@@ -334,7 +334,8 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
334334 "ctlz" | "ctlz_nonzero" | "cttz" | "cttz_nonzero" | "ctpop" | "bswap" |
335335 "bitreverse" | "add_with_overflow" | "sub_with_overflow" |
336336 "mul_with_overflow" | "overflowing_add" | "overflowing_sub" | "overflowing_mul" |
337- "unchecked_div" | "unchecked_rem" | "unchecked_shl" | "unchecked_shr" | "exact_div" |
337+ "unchecked_div" | "unchecked_rem" | "unchecked_shl" | "unchecked_shr" |
338+ "unchecked_add" | "unchecked_sub" | "unchecked_mul" | "exact_div" |
338339 "rotate_left" | "rotate_right" | "saturating_add" | "saturating_sub" => {
339340 let ty = arg_tys[ 0 ] ;
340341 match int_type_width_signed ( ty, self ) {
@@ -430,6 +431,27 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> {
430431 } else {
431432 self . lshr ( args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) )
432433 } ,
434+ "unchecked_add" => {
435+ if signed {
436+ self . unchecked_sadd ( args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) )
437+ } else {
438+ self . unchecked_uadd ( args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) )
439+ }
440+ } ,
441+ "unchecked_sub" => {
442+ if signed {
443+ self . unchecked_ssub ( args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) )
444+ } else {
445+ self . unchecked_usub ( args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) )
446+ }
447+ } ,
448+ "unchecked_mul" => {
449+ if signed {
450+ self . unchecked_smul ( args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) )
451+ } else {
452+ self . unchecked_umul ( args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) )
453+ }
454+ } ,
433455 "rotate_left" | "rotate_right" => {
434456 let is_left = name == "rotate_left" ;
435457 let val = args[ 0 ] . immediate ( ) ;
0 commit comments