diff --git a/cranelift/codegen/src/isa/aarch64/lower.rs b/cranelift/codegen/src/isa/aarch64/lower.rs index 75b4cbe727..1c8f407b7b 100644 --- a/cranelift/codegen/src/isa/aarch64/lower.rs +++ b/cranelift/codegen/src/isa/aarch64/lower.rs @@ -616,7 +616,7 @@ fn collect_address_addends>( maybe_input_insn(ctx, extendee_input, Opcode::Iconst), extendop, ) { - let value = ctx.get_constant(insn).unwrap() as i64; + let value = (ctx.get_constant(insn).unwrap() & 0xFFFF_FFFF_u64) as i64; offset += value; } else { let reg = put_input_in_reg(ctx, extendee_input, NarrowValueMode::None); diff --git a/cranelift/filetests/filetests/isa/aarch64/amodes.clif b/cranelift/filetests/filetests/isa/aarch64/amodes.clif index ad109e340e..3f94a149f8 100644 --- a/cranelift/filetests/filetests/isa/aarch64/amodes.clif +++ b/cranelift/filetests/filetests/isa/aarch64/amodes.clif @@ -344,3 +344,69 @@ block0(v0: i64, v1: i32): ; nextln: mov sp, fp ; nextln: ldp fp, lr, [sp], #16 ; nextln: ret + +function %f18(i64, i64, i64) -> i32 { +block0(v0: i64, v1: i64, v2: i64): + v3 = iconst.i32 -4098 + v6 = uextend.i64 v3 + v5 = sload16.i32 v6+0 + return v5 +} + +; check: stp fp, lr, [sp, #-16]! +; nextln: mov fp, sp +; nextln: movn w0, #4097 +; nextln: ldrsh x0, [x0] +; nextln: mov sp, fp +; nextln: ldp fp, lr, [sp], #16 +; nextln: ret + +function %f19(i64, i64, i64) -> i32 { +block0(v0: i64, v1: i64, v2: i64): + v3 = iconst.i32 4098 + v6 = uextend.i64 v3 + v5 = sload16.i32 v6+0 + return v5 +} + +; check: stp fp, lr, [sp, #-16]! +; nextln: mov fp, sp +; nextln: movz x0, #4098 +; nextln: ldrsh x0, [x0] +; nextln: mov sp, fp +; nextln: ldp fp, lr, [sp], #16 +; nextln: ret + +function %f20(i64, i64, i64) -> i32 { +block0(v0: i64, v1: i64, v2: i64): + v3 = iconst.i32 -4098 + v6 = sextend.i64 v3 + v5 = sload16.i32 v6+0 + return v5 +} + +; check: stp fp, lr, [sp, #-16]! +; nextln: mov fp, sp +; nextln: movn w0, #4097 +; nextln: sxtw x0, w0 +; nextln: ldrsh x0, [x0] +; nextln: mov sp, fp +; nextln: ldp fp, lr, [sp], #16 +; nextln: ret + +function %f21(i64, i64, i64) -> i32 { +block0(v0: i64, v1: i64, v2: i64): + v3 = iconst.i32 4098 + v6 = sextend.i64 v3 + v5 = sload16.i32 v6+0 + return v5 +} + +; check: stp fp, lr, [sp, #-16]! +; nextln: mov fp, sp +; nextln: movz x0, #4098 +; nextln: sxtw x0, w0 +; nextln: ldrsh x0, [x0] +; nextln: mov sp, fp +; nextln: ldp fp, lr, [sp], #16 +; nextln: ret