Add new immediate types for floating point and vector immediates. Use new immediates to define the constant value instructions in meta. Split the fconst instruction into two: f32const and f64const. This prevents confusion about the interpretation of 64 immediate bits when generating an f32 constant. Add an immvector ImmediateType. This immediate type is variable length, and provides all the bits of a SIMD vector directly.
32 lines
744 B
Plaintext
32 lines
744 B
Plaintext
function average(i32, i32) -> f32 {
|
|
ss1 = stack_slot 8, align 4 ; Stack slot for ``sum``.
|
|
|
|
entry ebb1(v1: i32, v2: i32):
|
|
v3 = f64const 0x0.0
|
|
stack_store v3, ss1
|
|
brz v2, ebb3 ; Handle count == 0.
|
|
v4 = iconst.i32 0
|
|
br ebb2(v4)
|
|
|
|
ebb2(v5: i32):
|
|
v6 = imul_imm v5, 4
|
|
v7 = iadd v1, v6
|
|
v8 = heap_load.f32 v7 ; array[i]
|
|
v9 = fext.f64 v8
|
|
v10 = stack_load.f64 ss1
|
|
v11 = fadd v9, v10
|
|
stack_store v11, ss1
|
|
v12 = iadd_imm v5, 1
|
|
v13 = icmp ult v12, v2
|
|
brnz v13, ebb2(v12) ; Loop backedge.
|
|
v14 = stack_load.f64 ss1
|
|
v15 = cvt_utof.f64 v2
|
|
v16 = fdiv v14, v15
|
|
v17 = ftrunc.f32 v16
|
|
return v17
|
|
|
|
ebb3:
|
|
v100 = f32const qNaN
|
|
return v100
|
|
}
|