branch_with_result/
branch_with_result.rs1use std::ptr::eq;
2use gnu_libjit::{Abi, Context, Label};
3fn main() {
4 let mut context = Context::new();
5 context.build_start();
6
7
8 let i32_type = Context::int_type();
9 let mut func = context.function(Abi::Cdecl, i32_type, vec![i32_type, i32_type]).unwrap();
10
11
12 let result = func.alloca(4);
13
14 let a = func.arg(0).unwrap();
15 let b = func.arg(1).unwrap();
16 let a_eq_b = func.insn_eq(&a, &b);
17 let mut done_label = Label::new();
18 let mut eq_label = Label::new();
19
20 func.insn_branch_if(&a_eq_b, &mut eq_label);
21 let a_minus_b = func.insn_sub(&a, &b);
22 func.insn_store(&result, &a_minus_b);
23 func.insn_branch(&mut done_label);
24 func.insn_label(&mut eq_label);
25 let a_plus_b = func.insn_add(&a, &b);
26 func.insn_store(&result, &a_plus_b);
27 func.insn_label(&mut done_label);
28 let ret = func.insn_load(&result);
29 let hundred = func.create_int_constant(100);
30 let ret = func.insn_add(&ret, &hundred);
31 func.insn_return(&ret);
32
33 println!("{}", func.dump().unwrap());
34
35 func.compile();
36 println!("{}", func.dump().unwrap());
37 context.build_end();
38
39
40 let result: extern "C" fn(i32, i32) -> i32 = func.to_closure();
41 println!("{} == 102", result(1,1));
42 println!("{} == 101", result(3,2));
43}
44
45