aboutsummaryrefslogtreecommitdiff
path: root/core/sys/llvm/code_generator.odin
blob: 7d41ed67bb0c3e8dc4d8d829483c8b8c9b5cbcb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Code Generator Intrinsics
package sys_llvm

@(default_calling_convention="none")
foreign _ {
	@(link_name="llvm.returnaddress")
	return_address :: proc(#const level: u32 = 0) -> rawptr ---

	@(link_name="llvm.addressofreturnaddress")
	address_of_return_address :: proc() -> rawptr ---

	@(link_name="llvm.sponentry")
	stack_pointer_on_entry :: proc() -> rawptr ---

	@(link_name="llvm.frameaddress")
	frame_address :: proc(#const level: u32 = 0) -> rawptr ---

	@(link_name="llvm.stacksave")
	stack_save :: proc() -> rawptr ---

	@(link_name="llvm.stackrestore")
	stack_restore :: proc(ptr: rawptr) ---

	@(link_name="llvm.get.dynamic.area.offset.i32")
	get_dynamic_area_offset_i32 :: proc() -> i32 ---

	@(link_name="llvm.get.dynamic.area.offset.i64")
	get_dynamic_area_offset_i64 :: proc() -> i64 ---
}


Prefetch_Read_Write :: enum i32 {
	Read = 0,
	Write = 1,
}

Prefetch_Locality :: enum i32 {
	None = 0,
	Low  = 1,
	Mid  = 2,
	High = 3,
}

Prefetch_Cache :: enum i32 {
	Instruction = 0,
	Data = 1,
}


@(default_calling_convention="none")
foreign _ {
	@(link_name="llvm.prefetch")
	prefetch :: proc(address: rawptr, #const rw: Prefetch_Read_Write, #const locality: Prefetch_Locality, #const cache: Prefetch_Cache) ---
}



@(default_calling_convention="none")
foreign _ {
	@(link_name="llvm.pcmarker")
	pc_marker :: proc(id: i32) ---

	@(link_name="llvm.readcyclecounter")
	read_cycle_counter :: proc() -> u64 ---

	@(link_name="llvm.clear_cache")
	clear_cache :: proc(rawptr, rawptr) ---

	@(link_name="llvm.thread.pointer")
	thread_pointer :: proc() -> rawptr ---
}