Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / X86 / x86-64-intrcc-uintr.ll
blob1fe395b84d46c3b4580911ebe37b323670630166
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
7 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
8 target triple = "x86_64-unknown-linux-gnu"
10 %struct.__uintr_frame = type { i64, i64, i64 }
12 ; #include <x86gprintrin.h>
14 ; void
15 ; __attribute__ ((interrupt))
16 ; test_uintr_isr_cc_empty(struct __uintr_frame *frame, unsigned long long uirrv)
17 ; {
18 ; }
20 define 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
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
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
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
44 entry:
45   ret void
48 ; unsigned long long g_rip;
49 ; unsigned long long g_rflags;
50 ; unsigned long long g_rsp;
51 ; unsigned long long g_uirrv;
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
67 define 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
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
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
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
149 entry:
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
162 attributes #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" }