diff --git a/cranelift/codegen/src/isa/x64/inst.isle b/cranelift/codegen/src/isa/x64/inst.isle index e214f171f7ee..069e2579e651 100644 --- a/cranelift/codegen/src/isa/x64/inst.isle +++ b/cranelift/codegen/src/isa/x64/inst.isle @@ -133,7 +133,8 @@ ;; Loads the memory address of addr into dst. (LoadEffectiveAddress (addr SyntheticAmode) - (dst WritableGpr)) + (dst WritableGpr) + (size OperandSize)) ;; Sign-extended loads and moves: movs (bl bq wl wq lq) addr reg. (MovsxRmR (ext_mode ExtMode) @@ -3551,10 +3552,10 @@ (inst MInst (MInst.Neg size src dst))) (ProducesFlags.ProducesFlagsReturnsResultWithConsumer inst dst))) -(decl x64_lea (SyntheticAmode) Gpr) -(rule (x64_lea addr) +(decl x64_lea (Type SyntheticAmode) Gpr) +(rule (x64_lea ty addr) (let ((dst WritableGpr (temp_writable_gpr)) - (_ Unit (emit (MInst.LoadEffectiveAddress addr dst)))) + (_ Unit (emit (MInst.LoadEffectiveAddress addr dst (operand_size_of_type_32_64 ty))))) dst)) ;; Helper for creating `ud2` instructions. diff --git a/cranelift/codegen/src/isa/x64/inst/emit.rs b/cranelift/codegen/src/isa/x64/inst/emit.rs index 9fb2c1599478..2d559dc1298f 100644 --- a/cranelift/codegen/src/isa/x64/inst/emit.rs +++ b/cranelift/codegen/src/isa/x64/inst/emit.rs @@ -871,20 +871,16 @@ pub(crate) fn emit( ) } - Inst::LoadEffectiveAddress { addr, dst } => { + Inst::LoadEffectiveAddress { addr, dst, size } => { let dst = allocs.next(dst.to_reg().to_reg()); let amode = addr.finalize(state, sink).with_allocs(allocs); + let flags = match size { + OperandSize::Size32 => RexFlags::clear_w(), + OperandSize::Size64 => RexFlags::set_w(), + _ => unreachable!(), + }; - emit_std_reg_mem( - sink, - LegacyPrefixes::None, - 0x8D, - 1, - dst, - &amode, - RexFlags::set_w(), - 0, - ); + emit_std_reg_mem(sink, LegacyPrefixes::None, 0x8D, 1, dst, &amode, flags, 0); } Inst::MovsxRmR { ext_mode, src, dst } => { diff --git a/cranelift/codegen/src/isa/x64/inst/mod.rs b/cranelift/codegen/src/isa/x64/inst/mod.rs index 396f9fd4a246..2fa0fe2371be 100644 --- a/cranelift/codegen/src/isa/x64/inst/mod.rs +++ b/cranelift/codegen/src/isa/x64/inst/mod.rs @@ -437,6 +437,7 @@ impl Inst { Inst::LoadEffectiveAddress { addr: addr.into(), dst: WritableGpr::from_writable_reg(dst).unwrap(), + size: OperandSize::Size64, } } @@ -1392,8 +1393,8 @@ impl PrettyPrint for Inst { format!("{} {}, {}", ljustify("movq".to_string()), src, dst) } - Inst::LoadEffectiveAddress { addr, dst } => { - let dst = pretty_print_reg(dst.to_reg().to_reg(), 8, allocs); + Inst::LoadEffectiveAddress { addr, dst, size } => { + let dst = pretty_print_reg(dst.to_reg().to_reg(), size.to_bytes(), allocs); let addr = addr.pretty_print(8, allocs); format!("{} {}, {}", ljustify("lea".to_string()), addr, dst) } @@ -2117,7 +2118,7 @@ fn x64_get_operands VReg>(inst: &Inst, collector: &mut OperandCol collector.reg_def(dst.to_writable_reg()); src.get_operands(collector); } - Inst::LoadEffectiveAddress { addr: src, dst } => { + Inst::LoadEffectiveAddress { addr: src, dst, .. } => { collector.reg_def(dst.to_writable_reg()); src.get_operands(collector); } diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle index 787029b01386..aa701ffcae60 100644 --- a/cranelift/codegen/src/isa/x64/lower.isle +++ b/cranelift/codegen/src/isa/x64/lower.isle @@ -41,17 +41,57 @@ ;; `i64` and smaller. -;; Add two registers. -(rule -5 (lower (has_type (fits_in_64 ty) +;; Base case for 8 and 16-bit types +(rule -6 (lower (has_type (fits_in_16 ty) (iadd x y))) (x64_add ty x y)) -;; The above case handles when the rhs is an immediate or a sinkable load, but -;; additionally add lhs meets these criteria. - +;; Base case for 32 and 64-bit types which might end up using the `lea` +;; instruction to fold multiple operations into one. The actualy determination +;; of whether to use `add` or `lea` is left up to the `add_or_lea` helper. +(rule -5 (lower (has_type (ty_32_or_64 ty) (iadd x y))) + (add_or_lea ty (to_amode_add (mem_flags_trusted) x y (zero_offset)))) + +;; Small helper used as part of the lowering of `iadd` just above which chooses +;; either `lea` or `add` for the `Amode` given. The x64 `lea` instruction in +;; theory is a superior `add` alternative offering the means to have a 3-operand +;; instruction (aka better regalloc) along with the ability to fold multiple +;; pieces of functionality into one. In practice though it seems that it's not +;; so cut-and-dry. The `meshoptimizer` benchmark's `vtx` measurement, for +;; example, gets 10% slower if `lea` is unconditionally used here. The apparent +;; reason for this is that x64 cores have dedicated units for computing +;; addresses, but a finite number of them. It seems that forcing everything +;; through these units can cause a slowdown vs also using the ALUs which are +;; otherwise idle if there's a lot of add instructions. +;; +;; Given all that a rough heuristic is applied here. If the `Amode` is "simple" +;; and basically looks like one add instruction then the `add` instruction is +;; itself used. This covers cases like `a + $constant` or `a + b`. In these +;; cases the theoretical downside to using `add` is that the 3-operand mode +;; can't be used and this may require an extra `mov` relative to an `lea` +;; instruction. +;; +;; Otherwise if the `Amode` is "complicated", or can fold more than one +;; arithmetic instruction into it, then an `lea` is used. This means that +;; expressions of the form `a + b * c` or `a + b + $const` generate a single +;; `lea` instruction. +;; +;; Locally on the `meshoptimizer` benchmark this at least preserves the +;; performance relative to "always use `add`". +(decl add_or_lea (Type Amode) Reg) +(rule 1 (add_or_lea ty (Amode.ImmReg imm reg _flags)) + (x64_add ty reg (RegMemImm.Imm imm))) +(rule 1 (add_or_lea ty (Amode.ImmRegRegShift 0 base index 0 _flags)) + (x64_add ty base index)) +(rule (add_or_lea ty mode) + (x64_lea ty mode)) + +;; Higher-priority cases than the previous two where a load can be sunk into +;; the add instruction itself. Note that both operands are tested for +;; sink-ability since addition is commutative (rule -4 (lower (has_type (fits_in_64 ty) - (iadd (simm32_from_value x) y))) - (x64_add ty y x)) + (iadd x (sinkable_load y)))) + (x64_add ty x y)) (rule -3 (lower (has_type (fits_in_64 ty) (iadd (sinkable_load x) y))) (x64_add ty y x)) @@ -442,7 +482,7 @@ (extern constructor ishl_i8x16_mask_table ishl_i8x16_mask_table) (rule (ishl_i8x16_mask (RegMemImm.Reg amt)) (let ((mask_table SyntheticAmode (ishl_i8x16_mask_table)) - (base_mask_addr Gpr (x64_lea mask_table)) + (base_mask_addr Gpr (x64_lea $I64 mask_table)) (mask_offset Gpr (x64_shl $I64 amt (imm8_to_imm8_gpr 4)))) (Amode.ImmRegRegShift 0 @@ -547,7 +587,7 @@ (extern constructor ushr_i8x16_mask_table ushr_i8x16_mask_table) (rule (ushr_i8x16_mask (RegMemImm.Reg amt)) (let ((mask_table SyntheticAmode (ushr_i8x16_mask_table)) - (base_mask_addr Gpr (x64_lea mask_table)) + (base_mask_addr Gpr (x64_lea $I64 mask_table)) (mask_offset Gpr (x64_shl $I64 amt (imm8_to_imm8_gpr 4)))) diff --git a/cranelift/filetests/filetests/isa/x64/immediates.clif b/cranelift/filetests/filetests/isa/x64/immediates.clif index bdbd7ece6ab4..a5fc63e65be6 100644 --- a/cranelift/filetests/filetests/isa/x64/immediates.clif +++ b/cranelift/filetests/filetests/isa/x64/immediates.clif @@ -19,15 +19,16 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movq %rdi, %r9 -; addq %r9, const(0), %r9 -; movq %r9, 0(%rsi) -; movq %rdi, %r10 -; subq %r10, const(0), %r10 -; movq %r10, 0(%rsi) +; movabsq $-18765284782900, %r9 ; movq %rdi, %r11 -; andq %r11, const(0), %r11 +; addq %r11, %r9, %r11 ; movq %r11, 0(%rsi) +; movq %rdi, %r11 +; subq %r11, const(0), %r11 +; movq %r11, 0(%rsi) +; movq %rdi, %rax +; andq %rax, const(0), %rax +; movq %rax, 0(%rsi) ; orq %rdi, const(0), %rdi ; movq %rdi, 0(%rsi) ; movq %rbp, %rsp @@ -39,23 +40,21 @@ block0(v0: i64, v1: i64): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movq %rdi, %r9 -; addq 0x32(%rip), %r9 -; movq %r9, (%rsi) ; trap: heap_oob -; movq %rdi, %r10 -; subq 0x25(%rip), %r10 -; movq %r10, (%rsi) ; trap: heap_oob +; movabsq $18446725308424768716, %r9 +; movq %rdi, %r11 +; addq %r9, %r11 +; movq %r11, (%rsi) ; trap: heap_oob ; movq %rdi, %r11 -; andq 0x18(%rip), %r11 +; subq 0x1f(%rip), %r11 ; movq %r11, (%rsi) ; trap: heap_oob -; orq 0xe(%rip), %rdi +; movq %rdi, %rax +; andq 0x12(%rip), %rax +; movq %rax, (%rsi) ; trap: heap_oob +; orq 8(%rip), %rdi ; movq %rdi, (%rsi) ; trap: heap_oob ; movq %rbp, %rsp ; popq %rbp ; retq -; addb %al, (%rax) -; addb %al, (%rax) -; addb %al, (%rax) ; int3 ; int3 ; fstp %st(5) diff --git a/cranelift/filetests/filetests/isa/x64/lea.clif b/cranelift/filetests/filetests/isa/x64/lea.clif new file mode 100644 index 000000000000..77ba837c8c2f --- /dev/null +++ b/cranelift/filetests/filetests/isa/x64/lea.clif @@ -0,0 +1,279 @@ +test compile precise-output +target x86_64 + +function %add_i32(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = iadd v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; addl %eax, %esi, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; addl %esi, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i64(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v2 = iadd v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; addq %rax, %rsi, %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; addq %rsi, %rax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i32_const(i32) -> i32 { +block0(v0: i32): + v1 = iconst.i32 100 + v2 = iadd v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; addl %eax, $100, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; addl $0x64, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i64_const(i64) -> i64 { +block0(v0: i64): + v1 = iconst.i64 100 + v2 = iadd v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; addq %rax, $100, %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; addq $0x64, %rax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i32_i32_const(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = iconst.i32 100 + v3 = iadd v0, v1 + v4 = iadd v3, v2 + return v4 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; lea 100(%rdi,%rsi,1), %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; leal 0x64(%rdi, %rsi), %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i64_i64_const(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v2 = iconst.i64 100 + v3 = iadd v0, v1 + v4 = iadd v3, v2 + return v4 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; lea 100(%rdi,%rsi,1), %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; leaq 0x64(%rdi, %rsi), %rax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i32_i32_mul_const(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = iconst.i32 100 + v3 = iconst.i32 2 + v4 = ishl v1, v3 + v5 = iadd v0, v4 + v6 = iadd v5, v2 + return v6 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; lea 100(%rdi,%rsi,4), %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; leal 0x64(%rdi, %rsi, 4), %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i64_i64_mul_const(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v2 = iconst.i64 100 + v3 = iconst.i64 2 + v4 = ishl v1, v3 + v5 = iadd v0, v4 + v6 = iadd v5, v2 + return v6 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; lea 100(%rdi,%rsi,4), %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; leaq 0x64(%rdi, %rsi, 4), %rax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i32_i32_mul(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v3 = iconst.i32 2 + v4 = ishl v1, v3 + v5 = iadd v0, v4 + return v5 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; lea 0(%rdi,%rsi,4), %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; leal (%rdi, %rsi, 4), %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %add_i64_i64_mul(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v3 = iconst.i64 2 + v4 = ishl v1, v3 + v5 = iadd v0, v4 + return v5 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; lea 0(%rdi,%rsi,4), %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; leaq (%rdi, %rsi, 4), %rax +; movq %rbp, %rsp +; popq %rbp +; retq + diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 8bc688f26927..3c42b63e6be1 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -48,13 +48,12 @@ ;; movl %edi, %edi ;; movabsq $-4100, %rax ;; addq %rax, 8(%rdx), %rax -;; movq %rdi, %r11 -;; addq %r11, 0(%rdx), %r11 -;; addq %r11, $4096, %r11 -;; xorq %rcx, %rcx, %rcx +;; movq 0(%rdx), %rcx +;; lea 4096(%rcx,%rdi,1), %rcx +;; xorq %rdx, %rdx, %rdx ;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r11, %r11 -;; movl %esi, 0(%r11) +;; cmovnbeq %rdx, %rcx, %rcx +;; movl %esi, 0(%rcx) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -70,15 +69,14 @@ ;; movl %edi, %edi ;; movabsq $-4100, %rax ;; addq %rax, 8(%rsi), %rax -;; movq %rdi, %r11 -;; addq %r11, 0(%rsi), %r11 -;; addq %r11, $4096, %r11 -;; xorq %rsi, %rsi, %rsi +;; movq 0(%rsi), %rcx +;; lea 4096(%rcx,%rdi,1), %rsi +;; xorq %rcx, %rcx, %rcx ;; cmpq %rax, %rdi -;; cmovnbeq %rsi, %r11, %r11 -;; movl 0(%r11), %eax +;; cmovnbeq %rcx, %rsi, %rsi +;; movl 0(%rsi), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index f4f79fff1cc5..e97dccd2dd5f 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -46,15 +46,16 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r8d -;; movq %r8, %rdi -;; addq %rdi, const(1), %rdi +;; movq %r8, %rax +;; addq %rax, const(0), %rax ;; jnb ; ud2 heap_oob ; -;; movq 8(%rdx), %rax +;; movq 8(%rdx), %rcx ;; addq %r8, 0(%rdx), %r8 -;; addq %r8, const(0), %r8 -;; xorq %rcx, %rcx, %rcx -;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r8, %r8 +;; movl $-65536, %edx +;; addq %r8, %rdx, %r8 +;; xorq %rdx, %rdx, %rdx +;; cmpq %rcx, %rax +;; cmovnbeq %rdx, %r8, %r8 ;; movl %esi, 0(%r8) ;; jmp label1 ;; block1: @@ -69,18 +70,19 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r8d -;; movq %r8, %rdi -;; addq %rdi, const(1), %rdi +;; movq %r8, %rax +;; addq %rax, const(0), %rax ;; jnb ; ud2 heap_oob ; -;; movq 8(%rsi), %rax +;; movq 8(%rsi), %rcx ;; addq %r8, 0(%rsi), %r8 -;; addq %r8, const(0), %r8 -;; xorq %rcx, %rcx, %rcx -;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r8, %r8 +;; movl $-65536, %edx +;; addq %r8, %rdx, %r8 +;; xorq %rdx, %rdx, %rdx +;; cmpq %rcx, %rax +;; cmovnbeq %rdx, %r8, %r8 ;; movl 0(%r8), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index f10feb9cb83d..69169611ba93 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -48,13 +48,12 @@ ;; movl %edi, %edi ;; movabsq $-4097, %rax ;; addq %rax, 8(%rdx), %rax -;; movq %rdi, %r11 -;; addq %r11, 0(%rdx), %r11 -;; addq %r11, $4096, %r11 -;; xorq %rcx, %rcx, %rcx +;; movq 0(%rdx), %rcx +;; lea 4096(%rcx,%rdi,1), %rcx +;; xorq %rdx, %rdx, %rdx ;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r11, %r11 -;; movb %sil, 0(%r11) +;; cmovnbeq %rdx, %rcx, %rcx +;; movb %sil, 0(%rcx) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -70,15 +69,14 @@ ;; movl %edi, %edi ;; movabsq $-4097, %rax ;; addq %rax, 8(%rsi), %rax -;; movq %rdi, %r11 -;; addq %r11, 0(%rsi), %r11 -;; addq %r11, $4096, %r11 -;; xorq %rsi, %rsi, %rsi +;; movq 0(%rsi), %rcx +;; lea 4096(%rcx,%rdi,1), %rsi +;; xorq %rcx, %rcx, %rcx ;; cmpq %rax, %rdi -;; cmovnbeq %rsi, %r11, %r11 -;; movzbq 0(%r11), %rax +;; cmovnbeq %rcx, %rsi, %rsi +;; movzbq 0(%rsi), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index c68204b5d298..abdcf05534cb 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -46,15 +46,16 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r8d -;; movq %r8, %rdi -;; addq %rdi, const(1), %rdi +;; movq %r8, %rax +;; addq %rax, const(0), %rax ;; jnb ; ud2 heap_oob ; -;; movq 8(%rdx), %rax +;; movq 8(%rdx), %rcx ;; addq %r8, 0(%rdx), %r8 -;; addq %r8, const(0), %r8 -;; xorq %rcx, %rcx, %rcx -;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r8, %r8 +;; movl $-65536, %edx +;; addq %r8, %rdx, %r8 +;; xorq %rdx, %rdx, %rdx +;; cmpq %rcx, %rax +;; cmovnbeq %rdx, %r8, %r8 ;; movb %sil, 0(%r8) ;; jmp label1 ;; block1: @@ -69,18 +70,19 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r8d -;; movq %r8, %rdi -;; addq %rdi, const(1), %rdi +;; movq %r8, %rax +;; addq %rax, const(0), %rax ;; jnb ; ud2 heap_oob ; -;; movq 8(%rsi), %rax +;; movq 8(%rsi), %rcx ;; addq %r8, 0(%rsi), %r8 -;; addq %r8, const(0), %r8 -;; xorq %rcx, %rcx, %rcx -;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r8, %r8 +;; movl $-65536, %edx +;; addq %r8, %rdx, %r8 +;; xorq %rdx, %rdx, %rdx +;; cmpq %rcx, %rax +;; cmovnbeq %rdx, %r8, %r8 ;; movzbq 0(%r8), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index e9cc1c103323..9b8f9e4b37b6 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -48,13 +48,12 @@ ;; movl %edi, %edi ;; movabsq $-4100, %rax ;; addq %rax, 8(%rdx), %rax -;; movq %rdi, %r11 -;; addq %r11, 0(%rdx), %r11 -;; addq %r11, $4096, %r11 -;; xorq %rcx, %rcx, %rcx +;; movq 0(%rdx), %rcx +;; lea 4096(%rcx,%rdi,1), %rcx +;; xorq %rdx, %rdx, %rdx ;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r11, %r11 -;; movl %esi, 0(%r11) +;; cmovnbeq %rdx, %rcx, %rcx +;; movl %esi, 0(%rcx) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -70,15 +69,14 @@ ;; movl %edi, %edi ;; movabsq $-4100, %rax ;; addq %rax, 8(%rsi), %rax -;; movq %rdi, %r11 -;; addq %r11, 0(%rsi), %r11 -;; addq %r11, $4096, %r11 -;; xorq %rsi, %rsi, %rsi +;; movq 0(%rsi), %rcx +;; lea 4096(%rcx,%rdi,1), %rsi +;; xorq %rcx, %rcx, %rcx ;; cmpq %rax, %rdi -;; cmovnbeq %rsi, %r11, %r11 -;; movl 0(%r11), %eax +;; cmovnbeq %rcx, %rsi, %rsi +;; movl 0(%rsi), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index f4ffb0d0f1f8..607aa6c34fa9 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -46,15 +46,16 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r8d -;; movq %r8, %rdi -;; addq %rdi, const(1), %rdi +;; movq %r8, %rax +;; addq %rax, const(0), %rax ;; jnb ; ud2 heap_oob ; -;; movq 8(%rdx), %rax +;; movq 8(%rdx), %rcx ;; addq %r8, 0(%rdx), %r8 -;; addq %r8, const(0), %r8 -;; xorq %rcx, %rcx, %rcx -;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r8, %r8 +;; movl $-65536, %edx +;; addq %r8, %rdx, %r8 +;; xorq %rdx, %rdx, %rdx +;; cmpq %rcx, %rax +;; cmovnbeq %rdx, %r8, %r8 ;; movl %esi, 0(%r8) ;; jmp label1 ;; block1: @@ -69,18 +70,19 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r8d -;; movq %r8, %rdi -;; addq %rdi, const(1), %rdi +;; movq %r8, %rax +;; addq %rax, const(0), %rax ;; jnb ; ud2 heap_oob ; -;; movq 8(%rsi), %rax +;; movq 8(%rsi), %rcx ;; addq %r8, 0(%rsi), %r8 -;; addq %r8, const(0), %r8 -;; xorq %rcx, %rcx, %rcx -;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r8, %r8 +;; movl $-65536, %edx +;; addq %r8, %rdx, %r8 +;; xorq %rdx, %rdx, %rdx +;; cmpq %rcx, %rax +;; cmovnbeq %rdx, %r8, %r8 ;; movl 0(%r8), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index a5d43ce9c316..99113750d30b 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -48,13 +48,12 @@ ;; movl %edi, %edi ;; movabsq $-4097, %rax ;; addq %rax, 8(%rdx), %rax -;; movq %rdi, %r11 -;; addq %r11, 0(%rdx), %r11 -;; addq %r11, $4096, %r11 -;; xorq %rcx, %rcx, %rcx +;; movq 0(%rdx), %rcx +;; lea 4096(%rcx,%rdi,1), %rcx +;; xorq %rdx, %rdx, %rdx ;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r11, %r11 -;; movb %sil, 0(%r11) +;; cmovnbeq %rdx, %rcx, %rcx +;; movb %sil, 0(%rcx) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -70,15 +69,14 @@ ;; movl %edi, %edi ;; movabsq $-4097, %rax ;; addq %rax, 8(%rsi), %rax -;; movq %rdi, %r11 -;; addq %r11, 0(%rsi), %r11 -;; addq %r11, $4096, %r11 -;; xorq %rsi, %rsi, %rsi +;; movq 0(%rsi), %rcx +;; lea 4096(%rcx,%rdi,1), %rsi +;; xorq %rcx, %rcx, %rcx ;; cmpq %rax, %rdi -;; cmovnbeq %rsi, %r11, %r11 -;; movzbq 0(%r11), %rax +;; cmovnbeq %rcx, %rsi, %rsi +;; movzbq 0(%rsi), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index a67a3975ab7b..2e5da51a2e70 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i32_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -46,15 +46,16 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r8d -;; movq %r8, %rdi -;; addq %rdi, const(1), %rdi +;; movq %r8, %rax +;; addq %rax, const(0), %rax ;; jnb ; ud2 heap_oob ; -;; movq 8(%rdx), %rax +;; movq 8(%rdx), %rcx ;; addq %r8, 0(%rdx), %r8 -;; addq %r8, const(0), %r8 -;; xorq %rcx, %rcx, %rcx -;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r8, %r8 +;; movl $-65536, %edx +;; addq %r8, %rdx, %r8 +;; xorq %rdx, %rdx, %rdx +;; cmpq %rcx, %rax +;; cmovnbeq %rdx, %r8, %r8 ;; movb %sil, 0(%r8) ;; jmp label1 ;; block1: @@ -69,18 +70,19 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r8d -;; movq %r8, %rdi -;; addq %rdi, const(1), %rdi +;; movq %r8, %rax +;; addq %rax, const(0), %rax ;; jnb ; ud2 heap_oob ; -;; movq 8(%rsi), %rax +;; movq 8(%rsi), %rcx ;; addq %r8, 0(%rsi), %r8 -;; addq %r8, const(0), %r8 -;; xorq %rcx, %rcx, %rcx -;; cmpq %rax, %rdi -;; cmovnbeq %rcx, %r8, %r8 +;; movl $-65536, %edx +;; addq %r8, %rdx, %r8 +;; xorq %rdx, %rdx, %rdx +;; cmpq %rcx, %rax +;; cmovnbeq %rdx, %r8, %r8 ;; movzbq 0(%r8), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 6a2274169103..ca9a9ac97e9d 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -47,13 +47,12 @@ ;; block0: ;; movabsq $-4100, %rax ;; addq %rax, 8(%rdx), %rax -;; movq %rdi, %r10 -;; addq %r10, 0(%rdx), %r10 -;; addq %r10, $4096, %r10 -;; xorq %r11, %r11, %r11 +;; movq 0(%rdx), %rcx +;; lea 4096(%rcx,%rdi,1), %r11 +;; xorq %rcx, %rcx, %rcx ;; cmpq %rax, %rdi -;; cmovnbeq %r11, %r10, %r10 -;; movl %esi, 0(%r10) +;; cmovnbeq %rcx, %r11, %r11 +;; movl %esi, 0(%r11) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -66,18 +65,16 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rsi, %rax -;; movabsq $-4100, %rsi -;; addq %rsi, 8(%rax), %rsi -;; movq %rdi, %r10 -;; addq %r10, 0(%rax), %r10 -;; addq %r10, $4096, %r10 -;; xorq %r11, %r11, %r11 -;; cmpq %rsi, %rdi -;; cmovnbeq %r11, %r10, %r10 -;; movl 0(%r10), %eax +;; movabsq $-4100, %rcx +;; addq %rcx, 8(%rsi), %rcx +;; movq 0(%rsi), %rsi +;; lea 4096(%rsi,%rdi,1), %r11 +;; xorq %rax, %rax, %rax +;; cmpq %rcx, %rdi +;; cmovnbeq %rax, %r11, %r11 +;; movl 0(%r11), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 0a1c3e7e4e42..c6320f2c9a24 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -46,12 +46,13 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movq %rdi, %rcx -;; addq %rcx, const(1), %rcx +;; addq %rcx, const(0), %rcx ;; jnb ; ud2 heap_oob ; ;; movq 8(%rdx), %rax ;; movq %rdi, %r11 ;; addq %r11, 0(%rdx), %r11 -;; addq %r11, const(0), %r11 +;; movl $-65536, %edi +;; addq %r11, %rdi, %r11 ;; xorq %rdi, %rdi, %rdi ;; cmpq %rax, %rcx ;; cmovnbeq %rdi, %r11, %r11 @@ -69,18 +70,19 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movq %rdi, %rcx -;; addq %rcx, const(1), %rcx +;; addq %rcx, const(0), %rcx ;; jnb ; ud2 heap_oob ; ;; movq 8(%rsi), %rax ;; movq %rdi, %r11 ;; addq %r11, 0(%rsi), %r11 -;; addq %r11, const(0), %r11 -;; xorq %rsi, %rsi, %rsi +;; movl $-65536, %edi +;; addq %r11, %rdi, %r11 +;; xorq %rdi, %rdi, %rdi ;; cmpq %rax, %rcx -;; cmovnbeq %rsi, %r11, %r11 +;; cmovnbeq %rdi, %r11, %r11 ;; movl 0(%r11), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 7e1de03d11dc..28522fed9b33 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -47,13 +47,12 @@ ;; block0: ;; movabsq $-4097, %rax ;; addq %rax, 8(%rdx), %rax -;; movq %rdi, %r10 -;; addq %r10, 0(%rdx), %r10 -;; addq %r10, $4096, %r10 -;; xorq %r11, %r11, %r11 +;; movq 0(%rdx), %rcx +;; lea 4096(%rcx,%rdi,1), %r11 +;; xorq %rcx, %rcx, %rcx ;; cmpq %rax, %rdi -;; cmovnbeq %r11, %r10, %r10 -;; movb %sil, 0(%r10) +;; cmovnbeq %rcx, %r11, %r11 +;; movb %sil, 0(%r11) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -66,18 +65,16 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rsi, %rax -;; movabsq $-4097, %rsi -;; addq %rsi, 8(%rax), %rsi -;; movq %rdi, %r10 -;; addq %r10, 0(%rax), %r10 -;; addq %r10, $4096, %r10 -;; xorq %r11, %r11, %r11 -;; cmpq %rsi, %rdi -;; cmovnbeq %r11, %r10, %r10 -;; movzbq 0(%r10), %rax +;; movabsq $-4097, %rcx +;; addq %rcx, 8(%rsi), %rcx +;; movq 0(%rsi), %rsi +;; lea 4096(%rsi,%rdi,1), %r11 +;; xorq %rax, %rax, %rax +;; cmpq %rcx, %rdi +;; cmovnbeq %rax, %r11, %r11 +;; movzbq 0(%r11), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat index b29744517616..f282bb4d659d 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -46,12 +46,13 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movq %rdi, %rcx -;; addq %rcx, const(1), %rcx +;; addq %rcx, const(0), %rcx ;; jnb ; ud2 heap_oob ; ;; movq 8(%rdx), %rax ;; movq %rdi, %r11 ;; addq %r11, 0(%rdx), %r11 -;; addq %r11, const(0), %r11 +;; movl $-65536, %edi +;; addq %r11, %rdi, %r11 ;; xorq %rdi, %rdi, %rdi ;; cmpq %rax, %rcx ;; cmovnbeq %rdi, %r11, %r11 @@ -69,18 +70,19 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movq %rdi, %rcx -;; addq %rcx, const(1), %rcx +;; addq %rcx, const(0), %rcx ;; jnb ; ud2 heap_oob ; ;; movq 8(%rsi), %rax ;; movq %rdi, %r11 ;; addq %r11, 0(%rsi), %r11 -;; addq %r11, const(0), %r11 -;; xorq %rsi, %rsi, %rsi +;; movl $-65536, %edi +;; addq %r11, %rdi, %r11 +;; xorq %rdi, %rdi, %rdi ;; cmpq %rax, %rcx -;; cmovnbeq %rsi, %r11, %r11 +;; cmovnbeq %rdi, %r11, %r11 ;; movzbq 0(%r11), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 7e7b96928778..99f3c89c12a0 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -47,13 +47,12 @@ ;; block0: ;; movabsq $-4100, %rax ;; addq %rax, 8(%rdx), %rax -;; movq %rdi, %r10 -;; addq %r10, 0(%rdx), %r10 -;; addq %r10, $4096, %r10 -;; xorq %r11, %r11, %r11 +;; movq 0(%rdx), %rcx +;; lea 4096(%rcx,%rdi,1), %r11 +;; xorq %rcx, %rcx, %rcx ;; cmpq %rax, %rdi -;; cmovnbeq %r11, %r10, %r10 -;; movl %esi, 0(%r10) +;; cmovnbeq %rcx, %r11, %r11 +;; movl %esi, 0(%r11) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -66,18 +65,16 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rsi, %rax -;; movabsq $-4100, %rsi -;; addq %rsi, 8(%rax), %rsi -;; movq %rdi, %r10 -;; addq %r10, 0(%rax), %r10 -;; addq %r10, $4096, %r10 -;; xorq %r11, %r11, %r11 -;; cmpq %rsi, %rdi -;; cmovnbeq %r11, %r10, %r10 -;; movl 0(%r10), %eax +;; movabsq $-4100, %rcx +;; addq %rcx, 8(%rsi), %rcx +;; movq 0(%rsi), %rsi +;; lea 4096(%rsi,%rdi,1), %r11 +;; xorq %rax, %rax, %rax +;; cmpq %rcx, %rdi +;; cmovnbeq %rax, %r11, %r11 +;; movl 0(%r11), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat index 6368789603ec..281d9cb37956 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0xffff0000_offset.wat @@ -46,12 +46,13 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movq %rdi, %rcx -;; addq %rcx, const(1), %rcx +;; addq %rcx, const(0), %rcx ;; jnb ; ud2 heap_oob ; ;; movq 8(%rdx), %rax ;; movq %rdi, %r11 ;; addq %r11, 0(%rdx), %r11 -;; addq %r11, const(0), %r11 +;; movl $-65536, %edi +;; addq %r11, %rdi, %r11 ;; xorq %rdi, %rdi, %rdi ;; cmpq %rax, %rcx ;; cmovnbeq %rdi, %r11, %r11 @@ -69,18 +70,19 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movq %rdi, %rcx -;; addq %rcx, const(1), %rcx +;; addq %rcx, const(0), %rcx ;; jnb ; ud2 heap_oob ; ;; movq 8(%rsi), %rax ;; movq %rdi, %r11 ;; addq %r11, 0(%rsi), %r11 -;; addq %r11, const(0), %r11 -;; xorq %rsi, %rsi, %rsi +;; movl $-65536, %edi +;; addq %r11, %rdi, %r11 +;; xorq %rdi, %rdi, %rdi ;; cmpq %rax, %rcx -;; cmovnbeq %rsi, %r11, %r11 +;; cmovnbeq %rdi, %r11, %r11 ;; movl 0(%r11), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index ba1cf005500b..a0cffc83b564 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -47,13 +47,12 @@ ;; block0: ;; movabsq $-4097, %rax ;; addq %rax, 8(%rdx), %rax -;; movq %rdi, %r10 -;; addq %r10, 0(%rdx), %r10 -;; addq %r10, $4096, %r10 -;; xorq %r11, %r11, %r11 +;; movq 0(%rdx), %rcx +;; lea 4096(%rcx,%rdi,1), %r11 +;; xorq %rcx, %rcx, %rcx ;; cmpq %rax, %rdi -;; cmovnbeq %r11, %r10, %r10 -;; movb %sil, 0(%r10) +;; cmovnbeq %rcx, %r11, %r11 +;; movb %sil, 0(%r11) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -66,18 +65,16 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rsi, %rax -;; movabsq $-4097, %rsi -;; addq %rsi, 8(%rax), %rsi -;; movq %rdi, %r10 -;; addq %r10, 0(%rax), %r10 -;; addq %r10, $4096, %r10 -;; xorq %r11, %r11, %r11 -;; cmpq %rsi, %rdi -;; cmovnbeq %r11, %r10, %r10 -;; movzbq 0(%r10), %rax +;; movabsq $-4097, %rcx +;; addq %rcx, 8(%rsi), %rcx +;; movq 0(%rsi), %rsi +;; lea 4096(%rsi,%rdi,1), %r11 +;; xorq %rax, %rax, %rax +;; cmpq %rcx, %rdi +;; cmovnbeq %rax, %r11, %r11 +;; movzbq 0(%r11), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat index 003dd6aa8598..cb1d7b671807 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_dynamic_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0xffff0000_offset.wat @@ -46,12 +46,13 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movq %rdi, %rcx -;; addq %rcx, const(1), %rcx +;; addq %rcx, const(0), %rcx ;; jnb ; ud2 heap_oob ; ;; movq 8(%rdx), %rax ;; movq %rdi, %r11 ;; addq %r11, 0(%rdx), %r11 -;; addq %r11, const(0), %r11 +;; movl $-65536, %edi +;; addq %r11, %rdi, %r11 ;; xorq %rdi, %rdi, %rdi ;; cmpq %rax, %rcx ;; cmovnbeq %rdi, %r11, %r11 @@ -69,18 +70,19 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movq %rdi, %rcx -;; addq %rcx, const(1), %rcx +;; addq %rcx, const(0), %rcx ;; jnb ; ud2 heap_oob ; ;; movq 8(%rsi), %rax ;; movq %rdi, %r11 ;; addq %r11, 0(%rsi), %r11 -;; addq %r11, const(0), %r11 -;; xorq %rsi, %rsi, %rsi +;; movl $-65536, %edi +;; addq %r11, %rdi, %r11 +;; xorq %rdi, %rdi, %rdi ;; cmpq %rax, %rcx -;; cmovnbeq %rsi, %r11, %r11 +;; cmovnbeq %rdi, %r11, %r11 ;; movzbq 0(%r11), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index 2f434668a1e3..3a6c1b9dcbb7 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i32_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -44,13 +44,12 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r11d -;; movq %r11, %r9 -;; addq %r9, 0(%rdx), %r9 -;; addq %r9, $4096, %r9 -;; xorq %r10, %r10, %r10 +;; movq 0(%rdx), %rdi +;; lea 4096(%rdi,%r11,1), %r10 +;; xorq %rdi, %rdi, %rdi ;; cmpq $268431356, %r11 -;; cmovnbeq %r10, %r9, %r9 -;; movl %esi, 0(%r9) +;; cmovnbeq %rdi, %r10, %r10 +;; movl %esi, 0(%r10) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -64,15 +63,14 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r11d -;; movq %r11, %r9 -;; addq %r9, 0(%rsi), %r9 -;; addq %r9, $4096, %r9 -;; xorq %r10, %r10, %r10 +;; movq 0(%rsi), %rsi +;; lea 4096(%rsi,%r11,1), %r10 +;; xorq %rsi, %rsi, %rsi ;; cmpq $268431356, %r11 -;; cmovnbeq %r10, %r9, %r9 -;; movl 0(%r9), %eax +;; cmovnbeq %rsi, %r10, %r10 +;; movl 0(%r10), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index 7b8d88b480be..70caad3ef762 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i32_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -44,13 +44,12 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r11d -;; movq %r11, %r9 -;; addq %r9, 0(%rdx), %r9 -;; addq %r9, $4096, %r9 -;; xorq %r10, %r10, %r10 +;; movq 0(%rdx), %rdi +;; lea 4096(%rdi,%r11,1), %r10 +;; xorq %rdi, %rdi, %rdi ;; cmpq $268431359, %r11 -;; cmovnbeq %r10, %r9, %r9 -;; movb %sil, 0(%r9) +;; cmovnbeq %rdi, %r10, %r10 +;; movb %sil, 0(%r10) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -64,15 +63,14 @@ ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: ;; movl %edi, %r11d -;; movq %r11, %r9 -;; addq %r9, 0(%rsi), %r9 -;; addq %r9, $4096, %r9 -;; xorq %r10, %r10, %r10 +;; movq 0(%rsi), %rsi +;; lea 4096(%rsi,%r11,1), %r10 +;; xorq %rsi, %rsi, %rsi ;; cmpq $268431359, %r11 -;; cmovnbeq %r10, %r9, %r9 -;; movzbq 0(%r9), %rax +;; cmovnbeq %rsi, %r10, %r10 +;; movzbq 0(%r10), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat index cb65508f605c..cc461ab9fddb 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -43,13 +43,12 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rdi, %r8 -;; addq %r8, 0(%rdx), %r8 -;; addq %r8, $4096, %r8 -;; xorq %r9, %r9, %r9 +;; movq 0(%rdx), %r10 +;; lea 4096(%r10,%rdi,1), %r9 +;; xorq %r10, %r10, %r10 ;; cmpq $268431356, %rdi -;; cmovnbeq %r9, %r8, %r8 -;; movl %esi, 0(%r8) +;; cmovnbeq %r10, %r9, %r9 +;; movl %esi, 0(%r9) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -62,15 +61,14 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rdi, %r8 -;; addq %r8, 0(%rsi), %r8 -;; addq %r8, $4096, %r8 -;; xorq %r9, %r9, %r9 +;; movq 0(%rsi), %r10 +;; lea 4096(%r10,%rdi,1), %r9 +;; xorq %r10, %r10, %r10 ;; cmpq $268431356, %rdi -;; cmovnbeq %r9, %r8, %r8 -;; movl 0(%r8), %eax +;; cmovnbeq %r10, %r9, %r9 +;; movl 0(%r9), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat index d706afe92e85..ed9ca6fad8f9 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -43,13 +43,12 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rdi, %r8 -;; addq %r8, 0(%rdx), %r8 -;; addq %r8, $4096, %r8 -;; xorq %r9, %r9, %r9 +;; movq 0(%rdx), %r10 +;; lea 4096(%r10,%rdi,1), %r9 +;; xorq %r10, %r10, %r10 ;; cmpq $268431359, %rdi -;; cmovnbeq %r9, %r8, %r8 -;; movb %sil, 0(%r8) +;; cmovnbeq %r10, %r9, %r9 +;; movb %sil, 0(%r9) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -62,15 +61,14 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rdi, %r8 -;; addq %r8, 0(%rsi), %r8 -;; addq %r8, $4096, %r8 -;; xorq %r9, %r9, %r9 +;; movq 0(%rsi), %r10 +;; lea 4096(%r10,%rdi,1), %r9 +;; xorq %r10, %r10, %r10 ;; cmpq $268431359, %rdi -;; cmovnbeq %r9, %r8, %r8 -;; movzbq 0(%r8), %rax +;; cmovnbeq %r10, %r9, %r9 +;; movzbq 0(%r9), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat index 9758a1e0c8ae..5917c8e75587 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i32_access_0x1000_offset.wat @@ -43,13 +43,12 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rdi, %r8 -;; addq %r8, 0(%rdx), %r8 -;; addq %r8, $4096, %r8 -;; xorq %r9, %r9, %r9 +;; movq 0(%rdx), %r10 +;; lea 4096(%r10,%rdi,1), %r9 +;; xorq %r10, %r10, %r10 ;; cmpq $268431356, %rdi -;; cmovnbeq %r9, %r8, %r8 -;; movl %esi, 0(%r8) +;; cmovnbeq %r10, %r9, %r9 +;; movl %esi, 0(%r9) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -62,15 +61,14 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rdi, %r8 -;; addq %r8, 0(%rsi), %r8 -;; addq %r8, $4096, %r8 -;; xorq %r9, %r9, %r9 +;; movq 0(%rsi), %r10 +;; lea 4096(%r10,%rdi,1), %r9 +;; xorq %r10, %r10, %r10 ;; cmpq $268431356, %rdi -;; cmovnbeq %r9, %r8, %r8 -;; movl 0(%r8), %eax +;; cmovnbeq %r10, %r9, %r9 +;; movl 0(%r9), %eax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret diff --git a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat index 29284edfc23b..16dd75e526cf 100644 --- a/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat +++ b/cranelift/filetests/filetests/isa/x64/wasm/load_store_static_kind_i64_index_0xffffffff_guard_yes_spectre_i8_access_0x1000_offset.wat @@ -43,13 +43,12 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rdi, %r8 -;; addq %r8, 0(%rdx), %r8 -;; addq %r8, $4096, %r8 -;; xorq %r9, %r9, %r9 +;; movq 0(%rdx), %r10 +;; lea 4096(%r10,%rdi,1), %r9 +;; xorq %r10, %r10, %r10 ;; cmpq $268431359, %rdi -;; cmovnbeq %r9, %r8, %r8 -;; movb %sil, 0(%r8) +;; cmovnbeq %r10, %r9, %r9 +;; movb %sil, 0(%r9) ;; jmp label1 ;; block1: ;; movq %rbp, %rsp @@ -62,15 +61,14 @@ ;; movq %rsp, %rbp ;; unwind DefineNewFrame { offset_upward_to_caller_sp: 16, offset_downward_to_clobbers: 0 } ;; block0: -;; movq %rdi, %r8 -;; addq %r8, 0(%rsi), %r8 -;; addq %r8, $4096, %r8 -;; xorq %r9, %r9, %r9 +;; movq 0(%rsi), %r10 +;; lea 4096(%r10,%rdi,1), %r9 +;; xorq %r10, %r10, %r10 ;; cmpq $268431359, %rdi -;; cmovnbeq %r9, %r8, %r8 -;; movzbq 0(%r8), %rax +;; cmovnbeq %r10, %r9, %r9 +;; movzbq 0(%r9), %rax ;; jmp label1 ;; block1: ;; movq %rbp, %rsp ;; popq %rbp -;; ret \ No newline at end of file +;; ret