xref: /llvm-project/llvm/test/CodeGen/X86/x86-64-intrcc-uintr.ll (revision 0a54b36d5e6d941e25c60520a7317d75355aeae5)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp
2; RUN: llc < %s | FileCheck %s -check-prefixes=CHECK-USER
3; RUN: llc -O0 < %s | FileCheck %s -check-prefixes=CHECK0-USER
4; RUN: llc -code-model=kernel < %s | FileCheck %s -check-prefixes=CHECK-KERNEL
5; RUN: llc -O0 -code-model=kernel < %s | FileCheck %s -check-prefixes=CHECK0-KERNEL
6
7target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
8target triple = "x86_64-unknown-linux-gnu"
9
10%struct.__uintr_frame = type { i64, i64, i64 }
11
12; #include <x86gprintrin.h>
13;
14; void
15; __attribute__ ((interrupt))
16; test_uintr_isr_cc_empty(struct __uintr_frame *frame, unsigned long long uirrv)
17; {
18; }
19
20define dso_local x86_intrcc void @test_uintr_isr_cc_empty(ptr nocapture byval(%struct.__uintr_frame) %frame, i64 %uirrv) #0 {
21; CHECK-USER-LABEL: test_uintr_isr_cc_empty:
22; CHECK-USER:       # %bb.0: # %entry
23; CHECK-USER-NEXT:    pushq %rax
24; CHECK-USER-NEXT:    addq $16, %rsp
25; CHECK-USER-NEXT:    uiret
26;
27; CHECK0-USER-LABEL: test_uintr_isr_cc_empty:
28; CHECK0-USER:       # %bb.0: # %entry
29; CHECK0-USER-NEXT:    pushq %rax
30; CHECK0-USER-NEXT:    addq $16, %rsp
31; CHECK0-USER-NEXT:    uiret
32;
33; CHECK-KERNEL-LABEL: test_uintr_isr_cc_empty:
34; CHECK-KERNEL:       # %bb.0: # %entry
35; CHECK-KERNEL-NEXT:    pushq %rax
36; CHECK-KERNEL-NEXT:    addq $16, %rsp
37; CHECK-KERNEL-NEXT:    iretq
38;
39; CHECK0-KERNEL-LABEL: test_uintr_isr_cc_empty:
40; CHECK0-KERNEL:       # %bb.0: # %entry
41; CHECK0-KERNEL-NEXT:    pushq %rax
42; CHECK0-KERNEL-NEXT:    addq $16, %rsp
43; CHECK0-KERNEL-NEXT:    iretq
44entry:
45  ret void
46}
47
48; unsigned long long g_rip;
49; unsigned long long g_rflags;
50; unsigned long long g_rsp;
51; unsigned long long g_uirrv;
52;
53; void
54; __attribute__((interrupt))
55; test_uintr_isr_cc_args(struct __uintr_frame *frame, unsigned long long uirrv)
56; {
57;   g_rip = frame->rip;
58;   g_rflags = frame->rflags;
59;   g_rsp = frame->rsp;
60;   g_uirrv = uirrv;
61; }
62@g_rip = dso_local local_unnamed_addr global i64 0, align 8
63@g_rflags = dso_local local_unnamed_addr global i64 0, align 8
64@g_rsp = dso_local local_unnamed_addr global i64 0, align 8
65@g_uirrv = dso_local local_unnamed_addr global i64 0, align 8
66
67define dso_local x86_intrcc void @test_uintr_isr_cc_args(ptr nocapture readonly byval(%struct.__uintr_frame) %frame, i64 %uirrv) #0 {
68; CHECK-USER-LABEL: test_uintr_isr_cc_args:
69; CHECK-USER:       # %bb.0: # %entry
70; CHECK-USER-NEXT:    pushq %rax
71; CHECK-USER-NEXT:    pushq %rax
72; CHECK-USER-NEXT:    pushq %rdx
73; CHECK-USER-NEXT:    pushq %rcx
74; CHECK-USER-NEXT:    movq 32(%rsp), %rax
75; CHECK-USER-NEXT:    movq 40(%rsp), %rcx
76; CHECK-USER-NEXT:    movq 48(%rsp), %rdx
77; CHECK-USER-NEXT:    movq %rcx, g_rip(%rip)
78; CHECK-USER-NEXT:    movq %rdx, g_rflags(%rip)
79; CHECK-USER-NEXT:    movq 56(%rsp), %rcx
80; CHECK-USER-NEXT:    movq %rcx, g_rsp(%rip)
81; CHECK-USER-NEXT:    movq %rax, g_uirrv(%rip)
82; CHECK-USER-NEXT:    popq %rcx
83; CHECK-USER-NEXT:    popq %rdx
84; CHECK-USER-NEXT:    popq %rax
85; CHECK-USER-NEXT:    addq $16, %rsp
86; CHECK-USER-NEXT:    uiret
87;
88; CHECK0-USER-LABEL: test_uintr_isr_cc_args:
89; CHECK0-USER:       # %bb.0: # %entry
90; CHECK0-USER-NEXT:    pushq %rax
91; CHECK0-USER-NEXT:    pushq %rax
92; CHECK0-USER-NEXT:    pushq %rdx
93; CHECK0-USER-NEXT:    pushq %rcx
94; CHECK0-USER-NEXT:    movq 32(%rsp), %rax
95; CHECK0-USER-NEXT:    leaq 40(%rsp), %rcx
96; CHECK0-USER-NEXT:    movq (%rcx), %rdx
97; CHECK0-USER-NEXT:    movq %rdx, g_rip(%rip)
98; CHECK0-USER-NEXT:    movq 8(%rcx), %rdx
99; CHECK0-USER-NEXT:    movq %rdx, g_rflags(%rip)
100; CHECK0-USER-NEXT:    movq 16(%rcx), %rcx
101; CHECK0-USER-NEXT:    movq %rcx, g_rsp(%rip)
102; CHECK0-USER-NEXT:    movq %rax, g_uirrv(%rip)
103; CHECK0-USER-NEXT:    popq %rcx
104; CHECK0-USER-NEXT:    popq %rdx
105; CHECK0-USER-NEXT:    popq %rax
106; CHECK0-USER-NEXT:    addq $16, %rsp
107; CHECK0-USER-NEXT:    uiret
108;
109; CHECK-KERNEL-LABEL: test_uintr_isr_cc_args:
110; CHECK-KERNEL:       # %bb.0: # %entry
111; CHECK-KERNEL-NEXT:    pushq %rax
112; CHECK-KERNEL-NEXT:    pushq %rax
113; CHECK-KERNEL-NEXT:    pushq %rdx
114; CHECK-KERNEL-NEXT:    pushq %rcx
115; CHECK-KERNEL-NEXT:    movq 32(%rsp), %rax
116; CHECK-KERNEL-NEXT:    movq 40(%rsp), %rcx
117; CHECK-KERNEL-NEXT:    movq 48(%rsp), %rdx
118; CHECK-KERNEL-NEXT:    movq %rcx, g_rip(%rip)
119; CHECK-KERNEL-NEXT:    movq %rdx, g_rflags(%rip)
120; CHECK-KERNEL-NEXT:    movq 56(%rsp), %rcx
121; CHECK-KERNEL-NEXT:    movq %rcx, g_rsp(%rip)
122; CHECK-KERNEL-NEXT:    movq %rax, g_uirrv(%rip)
123; CHECK-KERNEL-NEXT:    popq %rcx
124; CHECK-KERNEL-NEXT:    popq %rdx
125; CHECK-KERNEL-NEXT:    popq %rax
126; CHECK-KERNEL-NEXT:    addq $16, %rsp
127; CHECK-KERNEL-NEXT:    iretq
128;
129; CHECK0-KERNEL-LABEL: test_uintr_isr_cc_args:
130; CHECK0-KERNEL:       # %bb.0: # %entry
131; CHECK0-KERNEL-NEXT:    pushq %rax
132; CHECK0-KERNEL-NEXT:    pushq %rax
133; CHECK0-KERNEL-NEXT:    pushq %rdx
134; CHECK0-KERNEL-NEXT:    pushq %rcx
135; CHECK0-KERNEL-NEXT:    movq 32(%rsp), %rax
136; CHECK0-KERNEL-NEXT:    leaq 40(%rsp), %rcx
137; CHECK0-KERNEL-NEXT:    movq (%rcx), %rdx
138; CHECK0-KERNEL-NEXT:    movq %rdx, g_rip(%rip)
139; CHECK0-KERNEL-NEXT:    movq 8(%rcx), %rdx
140; CHECK0-KERNEL-NEXT:    movq %rdx, g_rflags(%rip)
141; CHECK0-KERNEL-NEXT:    movq 16(%rcx), %rcx
142; CHECK0-KERNEL-NEXT:    movq %rcx, g_rsp(%rip)
143; CHECK0-KERNEL-NEXT:    movq %rax, g_uirrv(%rip)
144; CHECK0-KERNEL-NEXT:    popq %rcx
145; CHECK0-KERNEL-NEXT:    popq %rdx
146; CHECK0-KERNEL-NEXT:    popq %rax
147; CHECK0-KERNEL-NEXT:    addq $16, %rsp
148; CHECK0-KERNEL-NEXT:    iretq
149entry:
150  %0 = load i64, ptr %frame, align 8
151  store i64 %0, ptr @g_rip, align 8
152  %rflags = getelementptr inbounds %struct.__uintr_frame, ptr %frame, i64 0, i32 1
153  %1 = load i64, ptr %rflags, align 8
154  store i64 %1, ptr @g_rflags, align 8
155  %rsp = getelementptr inbounds %struct.__uintr_frame, ptr %frame, i64 0, i32 2
156  %2 = load i64, ptr %rsp, align 8
157  store i64 %2, ptr @g_rsp, align 8
158  store i64 %uirrv, ptr @g_uirrv, align 8
159  ret void
160}
161
162attributes #0 = { nofree norecurse nounwind willreturn "disable-tail-calls"="true" "frame-pointer"="none" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+uintr" "tune-cpu"="generic" }
163