Closed
Description
This code:
#[inline(never)]
pub fn do_ants() {
do_item(&Outer {
item: SpecificDisplayItem2::PopStackingContext,
info: LayoutPrimitiveInfo2::new(),
});
}
#[derive(Copy, Clone)]
pub struct LayoutPrimitiveInfo2 {
pub rect: [f32; 7],
pub is_backface_visible: u16,
}
impl LayoutPrimitiveInfo2 {
fn new() -> Self {
Self {
rect: [0.; 7],
is_backface_visible:0,
}
}
}
pub enum SpecificDisplayItem2 {
PopStackingContext,
Other([f64; 22]),
}
struct Outer {
item: SpecificDisplayItem2,
info: LayoutPrimitiveInfo2
}
fn do_item(di: &Outer) { unsafe { ext(di) } }
extern {
fn ext(di: &Outer);
}
compiles to
bad_pop_stacking_context::do_ants:
mov rbp, rsp
sub rsp, 256
xorps xmm0, xmm0
movaps xmmword, ptr, [rbp, -, 32], xmm0
mov qword, ptr, [rbp, -, 10], 0
mov qword, ptr, [rbp, -, 16], 0
mov qword, ptr, [rbp, -, 248], 0
mov rax, qword, ptr, [rbp, -, 32]
mov rcx, qword, ptr, [rbp, -, 24]
mov qword, ptr, [rbp, -, 64], rax
mov qword, ptr, [rbp, -, 56], rcx
mov rax, qword, ptr, [rbp, -, 16]
mov qword, ptr, [rbp, -, 48], rax
mov rax, qword, ptr, [rbp, -, 8]
mov qword, ptr, [rbp, -, 40], rax
lea rdi, [rbp, -, 248]
call _ext
add rsp, 256
pop rbp
ret
When the u16 is changed to a u32 we get the saner:
bad_pop_stacking_context::do_ants:
mov rbp, rsp
sub rsp, 224
mov qword, ptr, [rbp, -, 216], 0
mov qword, ptr, [rbp, -, 8], 0
mov qword, ptr, [rbp, -, 16], 0
mov qword, ptr, [rbp, -, 24], 0
mov qword, ptr, [rbp, -, 32], 0
lea rdi, [rbp, -, 216]
call _ext
add rsp, 224
pop rbp
ret