xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/hipe-prologue.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X32-Linux
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-linux-gnu -verify-machineinstrs | FileCheck %s -check-prefix=X64-Linux
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; The HiPE compiler (i.e., the native code compiler of the Erlang/OTP system)
5*9880d681SAndroid Build Coastguard Worker; adds a custom assembly prologue in order to efficiently manipulate the stack
6*9880d681SAndroid Build Coastguard Worker; at runtime.
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; Just to prevent the alloca from being optimized away.
9*9880d681SAndroid Build Coastguard Workerdeclare void @dummy_use(i32*, i32)
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine {i32, i32} @test_basic(i32 %hp, i32 %p) {
12*9880d681SAndroid Build Coastguard Worker  ; X32-Linux-LABEL:       test_basic:
13*9880d681SAndroid Build Coastguard Worker  ; X32-Linux-NOT:   calll inc_stack_0
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker  ; X64-Linux-LABEL:       test_basic:
16*9880d681SAndroid Build Coastguard Worker  ; X64-Linux-NOT:   callq inc_stack_0
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker  %mem = alloca i32, i32 10
19*9880d681SAndroid Build Coastguard Worker  call void @dummy_use (i32* %mem, i32 10)
20*9880d681SAndroid Build Coastguard Worker  %1 = insertvalue {i32, i32} undef, i32 %hp, 0
21*9880d681SAndroid Build Coastguard Worker  %2 = insertvalue {i32, i32} %1, i32 %p, 1
22*9880d681SAndroid Build Coastguard Worker  ret {i32, i32} %1
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine cc 11 {i32, i32} @test_basic_hipecc(i32 %hp, i32 %p) {
26*9880d681SAndroid Build Coastguard Worker  ; X32-Linux-LABEL:       test_basic_hipecc:
27*9880d681SAndroid Build Coastguard Worker  ; X32-Linux:       leal -140(%esp), %ebx
28*9880d681SAndroid Build Coastguard Worker  ; X32-Linux-NEXT:  cmpl 120(%ebp), %ebx
29*9880d681SAndroid Build Coastguard Worker  ; X32-Linux-NEXT:  jb .LBB1_1
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  ; X32-Linux:       ret
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker  ; X32-Linux:       .LBB1_1:
34*9880d681SAndroid Build Coastguard Worker  ; X32-Linux-NEXT:  calll inc_stack_0
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker  ; X64-Linux-LABEL:       test_basic_hipecc:
37*9880d681SAndroid Build Coastguard Worker  ; X64-Linux:       leaq -184(%rsp), %r14
38*9880d681SAndroid Build Coastguard Worker  ; X64-Linux-NEXT:  cmpq 120(%rbp), %r14
39*9880d681SAndroid Build Coastguard Worker  ; X64-Linux-NEXT:  jb .LBB1_1
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker  ; X64-Linux:       ret
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker  ; X64-Linux:       .LBB1_1:
44*9880d681SAndroid Build Coastguard Worker  ; X64-Linux-NEXT:  callq inc_stack_0
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker  %mem = alloca i32, i32 10
47*9880d681SAndroid Build Coastguard Worker  call void @dummy_use (i32* %mem, i32 10)
48*9880d681SAndroid Build Coastguard Worker  %1 = insertvalue {i32, i32} undef, i32 %hp, 0
49*9880d681SAndroid Build Coastguard Worker  %2 = insertvalue {i32, i32} %1, i32 %p, 1
50*9880d681SAndroid Build Coastguard Worker  ret {i32, i32} %2
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine cc 11 {i32,i32,i32} @test_nocall_hipecc(i32 %hp,i32 %p,i32 %x,i32 %y) {
54*9880d681SAndroid Build Coastguard Worker  ; X32-Linux-LABEL:       test_nocall_hipecc:
55*9880d681SAndroid Build Coastguard Worker  ; X32-Linux-NOT:   calll inc_stack_0
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker  ; X64-Linux-LABEL:       test_nocall_hipecc:
58*9880d681SAndroid Build Coastguard Worker  ; X64-Linux-NOT:   callq inc_stack_0
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker  %1 = add i32 %x, %y
61*9880d681SAndroid Build Coastguard Worker  %2 = mul i32 42, %1
62*9880d681SAndroid Build Coastguard Worker  %3 = sub i32 24, %2
63*9880d681SAndroid Build Coastguard Worker  %4 = insertvalue {i32, i32, i32} undef, i32 %hp, 0
64*9880d681SAndroid Build Coastguard Worker  %5 = insertvalue {i32, i32, i32} %4, i32 %p, 1
65*9880d681SAndroid Build Coastguard Worker  %6 = insertvalue {i32, i32, i32} %5, i32 %p, 2
66*9880d681SAndroid Build Coastguard Worker  ret {i32, i32, i32} %6
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker!hipe.literals = !{ !0, !1, !2 }
70*9880d681SAndroid Build Coastguard Worker!0 = !{ !"P_NSP_LIMIT", i32 120 }
71*9880d681SAndroid Build Coastguard Worker!1 = !{ !"X86_LEAF_WORDS", i32 24 }
72*9880d681SAndroid Build Coastguard Worker!2 = !{ !"AMD64_LEAF_WORDS", i32 18 }
73