diff options
| author | Ralf Jung <post@ralfj.de> | 2023-11-12 12:16:41 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2023-11-12 12:49:46 +0100 |
| commit | 31493c70fad547a4ba056aa2eddb6ec4d5255093 (patch) | |
| tree | 347e9117ea51263773fb99f7e51d9df23a9bcc52 /compiler/rustc_codegen_ssa/src | |
| parent | a04d56b36d8f634abd7bdd64dd859a30655f1818 (diff) | |
| download | rust-31493c70fad547a4ba056aa2eddb6ec4d5255093.tar.gz rust-31493c70fad547a4ba056aa2eddb6ec4d5255093.zip | |
interpret: simplify handling of shifts by no longer trying to handle signed and unsigned shift amounts in the same branch
Diffstat (limited to 'compiler/rustc_codegen_ssa/src')
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/base.rs | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/compiler/rustc_codegen_ssa/src/base.rs b/compiler/rustc_codegen_ssa/src/base.rs index 198e5696357..23054975548 100644 --- a/compiler/rustc_codegen_ssa/src/base.rs +++ b/compiler/rustc_codegen_ssa/src/base.rs @@ -322,8 +322,13 @@ pub fn cast_shift_expr_rhs<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>( if lhs_sz < rhs_sz { bx.trunc(rhs, lhs_llty) } else if lhs_sz > rhs_sz { - // FIXME (#1877: If in the future shifting by negative - // values is no longer undefined then this is wrong. + // We zero-extend even if the RHS is signed. So e.g. `(x: i32) << -1i8` will zero-extend the + // RHS to `255i32`. But then we mask the shift amount to be within the size of the LHS + // anyway so the result is `31` as it should be. All the extra bits introduced by zext + // are masked off so their value does not matter. + // FIXME: if we ever support 512bit integers, this will be wrong! For such large integers, + // the extra bits introduced by zext are *not* all masked away any more. + assert!(lhs_sz <= 256); bx.zext(rhs, lhs_llty) } else { rhs |
