xref: /llvm-project/llvm/test/CodeGen/AArch64/fpmode.ll (revision 9e30c96aee5c85b4a5b7efa79cc7c94c1edb9d5b)
1462d5830SSerge Pavlov; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2462d5830SSerge Pavlov; RUN: llc -mtriple=aarch64-none-linux-gnu %s -o - | FileCheck --check-prefix=DAG %s
3462d5830SSerge Pavlov; RUN: llc -mtriple=aarch64-none-linux-gnu -global-isel %s -o - | FileCheck --check-prefix=GIS %s
4462d5830SSerge Pavlov
5462d5830SSerge Pavlovdeclare i32 @llvm.get.fpmode.i32()
6462d5830SSerge Pavlovdeclare void @llvm.set.fpmode.i32(i32 %fpmode)
7462d5830SSerge Pavlovdeclare void @llvm.reset.fpmode()
8462d5830SSerge Pavlov
9*9e30c96aSSerge Pavlovdefine i32 @func_get_fpmode() #0 {
10*9e30c96aSSerge Pavlov; DAG-LABEL: func_get_fpmode:
11462d5830SSerge Pavlov; DAG:       // %bb.0: // %entry
12*9e30c96aSSerge Pavlov; DAG-NEXT:    mrs x0, FPCR
13*9e30c96aSSerge Pavlov; DAG-NEXT:    // kill: def $w0 killed $w0 killed $x0
14462d5830SSerge Pavlov; DAG-NEXT:    ret
15462d5830SSerge Pavlov;
16*9e30c96aSSerge Pavlov; GIS-LABEL: func_get_fpmode:
17462d5830SSerge Pavlov; GIS:       // %bb.0: // %entry
18462d5830SSerge Pavlov; GIS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
19462d5830SSerge Pavlov; GIS-NEXT:    add x0, sp, #12
20462d5830SSerge Pavlov; GIS-NEXT:    bl fegetmode
21462d5830SSerge Pavlov; GIS-NEXT:    ldr w0, [sp, #12]
22462d5830SSerge Pavlov; GIS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
23462d5830SSerge Pavlov; GIS-NEXT:    ret
24462d5830SSerge Pavloventry:
25462d5830SSerge Pavlov  %fpmode = call i32 @llvm.get.fpmode.i32()
26462d5830SSerge Pavlov  ret i32 %fpmode
27462d5830SSerge Pavlov}
28462d5830SSerge Pavlov
29*9e30c96aSSerge Pavlovdefine void @func_set_fpmode(i32 %fpmode) #0 {
30*9e30c96aSSerge Pavlov; DAG-LABEL: func_set_fpmode:
31462d5830SSerge Pavlov; DAG:       // %bb.0: // %entry
32*9e30c96aSSerge Pavlov; DAG-NEXT:    mov w8, w0
33*9e30c96aSSerge Pavlov; DAG-NEXT:    msr FPCR, x8
34462d5830SSerge Pavlov; DAG-NEXT:    ret
35462d5830SSerge Pavlov;
36*9e30c96aSSerge Pavlov; GIS-LABEL: func_set_fpmode:
37462d5830SSerge Pavlov; GIS:       // %bb.0: // %entry
38462d5830SSerge Pavlov; GIS-NEXT:    str x30, [sp, #-16]! // 8-byte Folded Spill
39462d5830SSerge Pavlov; GIS-NEXT:    str w0, [sp, #12]
40462d5830SSerge Pavlov; GIS-NEXT:    add x0, sp, #12
41462d5830SSerge Pavlov; GIS-NEXT:    bl fesetmode
42462d5830SSerge Pavlov; GIS-NEXT:    ldr x30, [sp], #16 // 8-byte Folded Reload
43462d5830SSerge Pavlov; GIS-NEXT:    ret
44462d5830SSerge Pavloventry:
45462d5830SSerge Pavlov  call void @llvm.set.fpmode.i32(i32 %fpmode)
46462d5830SSerge Pavlov  ret void
47462d5830SSerge Pavlov}
48462d5830SSerge Pavlov
49*9e30c96aSSerge Pavlovdefine void @func_reset_fpmode() #0 {
50*9e30c96aSSerge Pavlov; DAG-LABEL: func_reset_fpmode:
51462d5830SSerge Pavlov; DAG:       // %bb.0: // %entry
52*9e30c96aSSerge Pavlov; DAG-NEXT:    mov x9, #-48904 // =0xffffffffffff40f8
53*9e30c96aSSerge Pavlov; DAG-NEXT:    mrs x8, FPCR
54*9e30c96aSSerge Pavlov; DAG-NEXT:    movk x9, #63488, lsl #16
55*9e30c96aSSerge Pavlov; DAG-NEXT:    and x8, x8, x9
56*9e30c96aSSerge Pavlov; DAG-NEXT:    msr FPCR, x8
57462d5830SSerge Pavlov; DAG-NEXT:    ret
58462d5830SSerge Pavlov;
59*9e30c96aSSerge Pavlov; GIS-LABEL: func_reset_fpmode:
60462d5830SSerge Pavlov; GIS:       // %bb.0: // %entry
61462d5830SSerge Pavlov; GIS-NEXT:    mov x0, #-1 // =0xffffffffffffffff
62d659bd16SDavid Green; GIS-NEXT:    b fesetmode
63462d5830SSerge Pavloventry:
64462d5830SSerge Pavlov  call void @llvm.reset.fpmode()
65462d5830SSerge Pavlov  ret void
66462d5830SSerge Pavlov}
67462d5830SSerge Pavlov
68*9e30c96aSSerge Pavlovattributes #0 = { nounwind }
69