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