• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

henrythasler / rust-tiny-wasm / 27089938512

07 Jun 2026 10:29AM UTC coverage: 92.847% (-1.3%) from 94.121%
27089938512

Pull #6

github

web-flow
Merge 0a4fe7baf into df49d44a8
Pull Request #6: Feature/floats

426 of 470 new or added lines in 17 files covered. (90.64%)

5 existing lines in 3 files now uncovered.

1921 of 2069 relevant lines covered (92.85%)

64.65 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

64.2
/src/assembler.rs
1
use super::*;
2
use crate::runtime::{TrapCode, WasmReturnCode};
3
use aarch64::*;
4
use std::collections::HashMap;
5

6
pub mod aarch64;
7

8
pub fn emit_prologue(
158✔
9
    stack_size: usize,
158✔
10
    register_pool: &mut RegisterPool,
158✔
11
    machinecode: &mut Vec<u32>,
158✔
12
) {
158✔
13
    machinecode.push(0xA9BF7BFD); // stp fp, lr, [sp, #-16]!  ; create a new stack frame
158✔
14
    machinecode.push(processing::mov_sp(IReg::FP, IReg::SP, RegSize::Reg64bit)); // mov fp, sp
158✔
15

16
    if stack_size > 0 {
158✔
17
        if stack_size < 0x10000 {
93✔
18
            machinecode.push(arithmetic::sub_imm(
92✔
19
                IReg::SP,
92✔
20
                IReg::SP,
92✔
21
                stack_size as u32,
92✔
22
                false,
92✔
23
                RegSize::Reg64bit,
92✔
24
            ));
92✔
25
        } else {
92✔
26
            let reg = register_pool.alloc();
1✔
27
            compound::mov_large_immediate(reg, stack_size as i64, RegSize::Reg64bit, machinecode);
1✔
28
            machinecode.push(arithmetic::sub_extended_reg(
1✔
29
                IReg::SP,
1✔
30
                IReg::SP,
1✔
31
                reg,
1✔
32
                Extend::Uxtx,
1✔
33
                0,
1✔
34
                RegSize::Reg64bit,
1✔
35
            ));
1✔
36
            register_pool.free();
1✔
37
        }
1✔
38
    }
65✔
39
}
158✔
40

41
pub fn emit_epilogue(stack_size: usize, machinecode: &mut Vec<u32>) {
156✔
42
    if stack_size > 0 {
156✔
43
        // deallocate stack memory (add sp, sp, #stackSize)
92✔
44
        machinecode.push(arithmetic::add_imm(
92✔
45
            IReg::SP,
92✔
46
            IReg::SP,
92✔
47
            stack_size as u32,
92✔
48
            false,
92✔
49
            RegSize::Reg64bit,
92✔
50
        ));
92✔
51
    }
92✔
52
    machinecode.push(0xA8C17BFD); // ldp fp, lr, [sp], #16  ; destroy stack frame and restore FP, LR and SP
156✔
53
    machinecode.push(branch::ret(IReg::LR)); // ret
156✔
54
}
156✔
55

56
pub fn emit_trap_handler(
×
57
    machinecode: &mut Vec<u32>,
×
58
    trap_offsets: &mut HashMap<TrapCode, usize>,
×
59
) -> WasmFunction {
×
60
    let offset = machinecode.len();
×
61
    for (trap_cnt, &code) in TrapCode::ALL.iter().enumerate() {
×
62
        // store offset to current trap code
×
63
        trap_offsets.insert(code, machinecode.len());
×
64
        // emit a trap handler for each trap code, which moves the trap code to X1 and returns with X0=Trap (1)
×
NEW
65
        machinecode.push(processing::mov_imm(
×
NEW
66
            IReg::X1,
×
NEW
67
            code as u32,
×
NEW
68
            RegSize::Reg64bit,
×
NEW
69
        ));
×
70
        machinecode.push(branch::branch(
×
71
            ((TrapCode::ALL.len() - trap_cnt) as i32 * 2 - 1) * INSTRUCTION_SIZE as i32,
×
72
        )); // b <next trap handler>
×
73
    }
×
74
    machinecode.push(processing::mov_imm(
×
NEW
75
        IReg::X0,
×
76
        WasmReturnCode::Trap as u32,
×
77
        RegSize::Reg64bit,
×
78
    ));
NEW
79
    machinecode.push(branch::ret(IReg::LR)); // ret
×
80

81
    WasmFunction {
×
82
        name: String::from("trap_handler"),
×
83
        offset,
×
84
        length: machinecode.len() - offset,
×
85
    }
×
86
}
×
87

88
#[cfg(test)]
89
mod tests {
90
    use super::*;
91

92
    #[test]
93
    fn test_oversized_stack() {
1✔
94
        let mut register_pool = RegisterPool::default();
1✔
95
        let mut machinecode: Vec<u32> = vec![];
1✔
96
        emit_prologue(0x80000, &mut register_pool, &mut machinecode);
1✔
97
        assert_eq!(
1✔
98
            machinecode,
99
            vec![0xA9BF7BFD, 0x910003FD, 0xD2800008, 0xF2A00108, 0xCB2863FF]
1✔
100
        );
101
    }
1✔
102
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc