Add heaps to the Cretonne IL.
Add preamble syntax for declaring static and dynamic heaps, and update the langref section on heaps. Add IR support for heap references. Remove the heap_load and heap_store as discussed in #144. We will use heap_addr along with native load and store instructions in their place. Add the heap_addr instruction and document its bounds checking semantics.
This commit is contained in:
@@ -35,3 +35,32 @@ ebb0:
|
||||
v1 = global_addr.i32 gv1
|
||||
return v1
|
||||
}
|
||||
|
||||
; Declare static heaps.
|
||||
function %sheap(i32) -> i64 {
|
||||
heap1 = static reserved_reg, min 0x1_0000, bound 0x1_0000_0000, guard 0x8000_0000
|
||||
heap2 = static gv5, guard 0x1000, bound 0x1_0000
|
||||
gv5 = vmctx+64
|
||||
|
||||
; check: $heap1 = static reserved_reg, min 0x0001_0000, bound 0x0001_0000_0000, guard 0x8000_0000
|
||||
; check: $heap2 = static $gv5, min 0, bound 0x0001_0000, guard 4096
|
||||
ebb0(v1: i32):
|
||||
v2 = heap_addr.i64 heap1, v1, 0
|
||||
; check: $v2 = heap_addr.i64 $heap1, $v1, 0
|
||||
return v2
|
||||
}
|
||||
|
||||
; Declare dynamic heaps.
|
||||
function %dheap(i32) -> i64 {
|
||||
heap1 = dynamic reserved_reg, min 0x1_0000, bound gv6, guard 0x8000_0000
|
||||
heap2 = dynamic gv5, bound gv6, guard 0x1000
|
||||
gv5 = vmctx+64
|
||||
gv6 = vmctx+72
|
||||
|
||||
; check: $heap1 = dynamic reserved_reg, min 0x0001_0000, bound $gv6, guard 0x8000_0000
|
||||
; check: $heap2 = dynamic $gv5, min 0, bound $gv6, guard 4096
|
||||
ebb0(v1: i32):
|
||||
v2 = heap_addr.i64 heap2, v1, 0
|
||||
; check: $v2 = heap_addr.i64 $heap2, $v1, 0
|
||||
return v2
|
||||
}
|
||||
|
||||
@@ -136,20 +136,6 @@ ebb0:
|
||||
; nextln: stack_store $v1, $ss10+2
|
||||
; nextln: stack_store $v2, $ss2
|
||||
|
||||
; Heap access instructions.
|
||||
function %heap(i32) {
|
||||
; TODO: heap0 = heap %foo
|
||||
ebb0(v1: i32):
|
||||
v2 = heap_load.f32 v1
|
||||
v3 = heap_load.f32 v1+12
|
||||
heap_store v3, v1
|
||||
}
|
||||
; sameln: function %heap(i32) native {
|
||||
; nextln: ebb0($v1: i32):
|
||||
; nextln: $v2 = heap_load.f32 $v1
|
||||
; nextln: $v3 = heap_load.f32 $v1+12
|
||||
; nextln: heap_store $v3, $v1
|
||||
|
||||
; Memory access instructions.
|
||||
function %memory(i32) {
|
||||
ebb0(v1: i32):
|
||||
|
||||
Reference in New Issue
Block a user