Skip to content

Commit 77527c2

Browse files
bors[bot]nlewycky
andauthored
Merge #877
877: Reimplement F32Min, F32Max, F64Min and F64Max. r=nlewycky a=nlewycky # Description Reimplement F32Min, F32Max, F64Min and F64Max. Adds XMM8--15 registers. Adds VMOVA, VBLEND and VXORP, and the VCMPUNORD and VCMPORD comparisons. Fixes 419 test failures. Co-authored-by: Nick Lewycky <nick@wasmer.io>
2 parents fe158d0 + 88dc613 commit 77527c2

File tree

7 files changed

+662
-453
lines changed

7 files changed

+662
-453
lines changed

lib/runtime-core/image-loading-linux-x86-64.s

+24
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,30 @@ add $8, %rsp
4141
movq (%rsp), %xmm7
4242
add $8, %rsp
4343

44+
movq (%rsp), %xmm8
45+
add $8, %rsp
46+
47+
movq (%rsp), %xmm9
48+
add $8, %rsp
49+
50+
movq (%rsp), %xmm10
51+
add $8, %rsp
52+
53+
movq (%rsp), %xmm11
54+
add $8, %rsp
55+
56+
movq (%rsp), %xmm12
57+
add $8, %rsp
58+
59+
movq (%rsp), %xmm13
60+
add $8, %rsp
61+
62+
movq (%rsp), %xmm14
63+
add $8, %rsp
64+
65+
movq (%rsp), %xmm15
66+
add $8, %rsp
67+
4468
popq %rbp
4569
popq %rax
4670
popq %rbx

lib/runtime-core/image-loading-macos-x86-64.s

+24
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,30 @@ add $8, %rsp
4141
movq (%rsp), %xmm7
4242
add $8, %rsp
4343

44+
movq (%rsp), %xmm8
45+
add $8, %rsp
46+
47+
movq (%rsp), %xmm9
48+
add $8, %rsp
49+
50+
movq (%rsp), %xmm10
51+
add $8, %rsp
52+
53+
movq (%rsp), %xmm11
54+
add $8, %rsp
55+
56+
movq (%rsp), %xmm12
57+
add $8, %rsp
58+
59+
movq (%rsp), %xmm13
60+
add $8, %rsp
61+
62+
movq (%rsp), %xmm14
63+
add $8, %rsp
64+
65+
movq (%rsp), %xmm15
66+
add $8, %rsp
67+
4468
popq %rbp
4569
popq %rax
4670
popq %rbx

lib/runtime-core/src/fault.rs

+31-6
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ pub fn allocate_and_run<R, F: FnOnce() -> R>(size: usize, f: F) -> R {
207207

208208
// NOTE: Keep this consistent with `image-loading-*.s`.
209209
stack[end_offset - 4 - 10] = &mut ctx as *mut Context<F, R> as usize as u64; // rdi
210-
const NUM_SAVED_REGISTERS: usize = 23;
210+
const NUM_SAVED_REGISTERS: usize = 31;
211211
let stack_begin = stack
212212
.as_mut_ptr()
213213
.offset((end_offset - 4 - NUM_SAVED_REGISTERS) as isize);
@@ -347,7 +347,7 @@ unsafe fn install_sighandler() {
347347
pub struct FaultInfo {
348348
pub faulting_addr: *const c_void,
349349
pub ip: *const c_void,
350-
pub known_registers: [Option<u64>; 24],
350+
pub known_registers: [Option<u64>; 32],
351351
}
352352

353353
#[cfg(all(target_os = "linux", target_arch = "x86_64"))]
@@ -378,7 +378,7 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
378378
let gregs = &(*ucontext).uc_mcontext.gregs;
379379
let fpregs = &*(*ucontext).uc_mcontext.fpregs;
380380

381-
let mut known_registers: [Option<u64>; 24] = [None; 24];
381+
let mut known_registers: [Option<u64>; 32] = [None; 32];
382382
known_registers[X64Register::GPR(GPR::R15).to_index().0] = Some(gregs[REG_R15 as usize] as _);
383383
known_registers[X64Register::GPR(GPR::R14).to_index().0] = Some(gregs[REG_R14 as usize] as _);
384384
known_registers[X64Register::GPR(GPR::R13).to_index().0] = Some(gregs[REG_R13 as usize] as _);
@@ -405,6 +405,14 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
405405
known_registers[X64Register::XMM(XMM::XMM5).to_index().0] = Some(read_xmm(&fpregs._xmm[5]));
406406
known_registers[X64Register::XMM(XMM::XMM6).to_index().0] = Some(read_xmm(&fpregs._xmm[6]));
407407
known_registers[X64Register::XMM(XMM::XMM7).to_index().0] = Some(read_xmm(&fpregs._xmm[7]));
408+
known_registers[X64Register::XMM(XMM::XMM8).to_index().0] = Some(read_xmm(&fpregs._xmm[8]));
409+
known_registers[X64Register::XMM(XMM::XMM9).to_index().0] = Some(read_xmm(&fpregs._xmm[9]));
410+
known_registers[X64Register::XMM(XMM::XMM10).to_index().0] = Some(read_xmm(&fpregs._xmm[10]));
411+
known_registers[X64Register::XMM(XMM::XMM11).to_index().0] = Some(read_xmm(&fpregs._xmm[11]));
412+
known_registers[X64Register::XMM(XMM::XMM12).to_index().0] = Some(read_xmm(&fpregs._xmm[12]));
413+
known_registers[X64Register::XMM(XMM::XMM13).to_index().0] = Some(read_xmm(&fpregs._xmm[13]));
414+
known_registers[X64Register::XMM(XMM::XMM14).to_index().0] = Some(read_xmm(&fpregs._xmm[14]));
415+
known_registers[X64Register::XMM(XMM::XMM15).to_index().0] = Some(read_xmm(&fpregs._xmm[15]));
408416

409417
FaultInfo {
410418
faulting_addr: si_addr as usize as _,
@@ -458,8 +466,17 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
458466
}
459467
#[repr(C)]
460468
struct fpstate {
461-
_unused: [u8; 168],
462-
xmm: [[u64; 2]; 8],
469+
_cwd: u16,
470+
_swd: u16,
471+
_ftw: u16,
472+
_fop: u16,
473+
_rip: u64,
474+
_rdp: u64,
475+
_mxcsr: u32,
476+
_mxcr_mask: u32,
477+
_st: [[u16; 8]; 8],
478+
xmm: [[u64; 2]; 16],
479+
_padding: [u32; 24],
463480
}
464481
#[allow(dead_code)]
465482
#[repr(C)]
@@ -476,7 +493,7 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
476493
let ss = &(*(*ucontext).uc_mcontext).ss;
477494
let fs = &(*(*ucontext).uc_mcontext).fs;
478495

479-
let mut known_registers: [Option<u64>; 24] = [None; 24];
496+
let mut known_registers: [Option<u64>; 32] = [None; 32];
480497

481498
known_registers[X64Register::GPR(GPR::R15).to_index().0] = Some(ss.r15);
482499
known_registers[X64Register::GPR(GPR::R14).to_index().0] = Some(ss.r14);
@@ -504,6 +521,14 @@ pub unsafe fn get_fault_info(siginfo: *const c_void, ucontext: *const c_void) ->
504521
known_registers[X64Register::XMM(XMM::XMM5).to_index().0] = Some(fs.xmm[5][0]);
505522
known_registers[X64Register::XMM(XMM::XMM6).to_index().0] = Some(fs.xmm[6][0]);
506523
known_registers[X64Register::XMM(XMM::XMM7).to_index().0] = Some(fs.xmm[7][0]);
524+
known_registers[X64Register::XMM(XMM::XMM8).to_index().0] = Some(fs.xmm[8][0]);
525+
known_registers[X64Register::XMM(XMM::XMM9).to_index().0] = Some(fs.xmm[9][0]);
526+
known_registers[X64Register::XMM(XMM::XMM10).to_index().0] = Some(fs.xmm[10][0]);
527+
known_registers[X64Register::XMM(XMM::XMM11).to_index().0] = Some(fs.xmm[11][0]);
528+
known_registers[X64Register::XMM(XMM::XMM12).to_index().0] = Some(fs.xmm[12][0]);
529+
known_registers[X64Register::XMM(XMM::XMM13).to_index().0] = Some(fs.xmm[13][0]);
530+
known_registers[X64Register::XMM(XMM::XMM14).to_index().0] = Some(fs.xmm[14][0]);
531+
known_registers[X64Register::XMM(XMM::XMM15).to_index().0] = Some(fs.xmm[15][0]);
507532

508533
FaultInfo {
509534
faulting_addr: si_addr,

lib/runtime-core/src/state.rs

+49-2
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,37 @@ pub mod x64 {
672672
stack_offset -= 1;
673673
stack[stack_offset] = stack.as_ptr().offset(last_stack_offset as isize) as usize as u64; // rbp
674674

675+
stack_offset -= 1;
676+
stack[stack_offset] =
677+
known_registers[X64Register::XMM(XMM::XMM15).to_index().0].unwrap_or(0);
678+
679+
stack_offset -= 1;
680+
stack[stack_offset] =
681+
known_registers[X64Register::XMM(XMM::XMM14).to_index().0].unwrap_or(0);
682+
683+
stack_offset -= 1;
684+
stack[stack_offset] =
685+
known_registers[X64Register::XMM(XMM::XMM13).to_index().0].unwrap_or(0);
686+
687+
stack_offset -= 1;
688+
stack[stack_offset] =
689+
known_registers[X64Register::XMM(XMM::XMM12).to_index().0].unwrap_or(0);
690+
691+
stack_offset -= 1;
692+
stack[stack_offset] =
693+
known_registers[X64Register::XMM(XMM::XMM11).to_index().0].unwrap_or(0);
694+
695+
stack_offset -= 1;
696+
stack[stack_offset] =
697+
known_registers[X64Register::XMM(XMM::XMM10).to_index().0].unwrap_or(0);
698+
699+
stack_offset -= 1;
700+
stack[stack_offset] =
701+
known_registers[X64Register::XMM(XMM::XMM9).to_index().0].unwrap_or(0);
702+
703+
stack_offset -= 1;
704+
stack[stack_offset] =
705+
known_registers[X64Register::XMM(XMM::XMM8).to_index().0].unwrap_or(0);
675706
stack_offset -= 1;
676707
stack[stack_offset] =
677708
known_registers[X64Register::XMM(XMM::XMM7).to_index().0].unwrap_or(0);
@@ -780,10 +811,10 @@ pub mod x64 {
780811
pub unsafe fn read_stack<'a, I: Iterator<Item = &'a CodeVersion>, F: Fn() -> I + 'a>(
781812
versions: F,
782813
mut stack: *const u64,
783-
initially_known_registers: [Option<u64>; 24],
814+
initially_known_registers: [Option<u64>; 32],
784815
mut initial_address: Option<u64>,
785816
) -> ExecutionStateImage {
786-
let mut known_registers: [Option<u64>; 24] = initially_known_registers;
817+
let mut known_registers: [Option<u64>; 32] = initially_known_registers;
787818
let mut results: Vec<WasmFunctionStateDump> = vec![];
788819
let mut was_baseline = true;
789820

@@ -1023,6 +1054,14 @@ pub mod x64 {
10231054
XMM5,
10241055
XMM6,
10251056
XMM7,
1057+
XMM8,
1058+
XMM9,
1059+
XMM10,
1060+
XMM11,
1061+
XMM12,
1062+
XMM13,
1063+
XMM14,
1064+
XMM15,
10261065
}
10271066

10281067
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
@@ -1066,6 +1105,14 @@ pub mod x64 {
10661105
22 => X64Register::XMM(XMM::XMM5),
10671106
23 => X64Register::XMM(XMM::XMM6),
10681107
24 => X64Register::XMM(XMM::XMM7),
1108+
25 => X64Register::XMM(XMM::XMM8),
1109+
26 => X64Register::XMM(XMM::XMM9),
1110+
27 => X64Register::XMM(XMM::XMM10),
1111+
28 => X64Register::XMM(XMM::XMM11),
1112+
29 => X64Register::XMM(XMM::XMM12),
1113+
30 => X64Register::XMM(XMM::XMM13),
1114+
31 => X64Register::XMM(XMM::XMM14),
1115+
32 => X64Register::XMM(XMM::XMM15),
10691116
_ => return None,
10701117
})
10711118
}

0 commit comments

Comments
 (0)