File: ghccc-rv64.ll

package info (click to toggle)
llvm-toolchain-14 1%3A14.0.6-12
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,496,180 kB
  • sloc: cpp: 5,593,972; ansic: 986,872; asm: 585,869; python: 184,223; objc: 72,530; lisp: 31,119; f90: 27,793; javascript: 9,780; pascal: 9,762; sh: 9,482; perl: 7,468; ml: 5,432; awk: 3,523; makefile: 2,538; xml: 953; cs: 573; fortran: 567
file content (114 lines) | stat: -rw-r--r-- 4,481 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv64 -mattr=+f,+d < %s | FileCheck %s

; Check the GHC call convention works (rv64)

@base  = external global i64 ; assigned to register: s1
@sp    = external global i64 ; assigned to register: s2
@hp    = external global i64 ; assigned to register: s3
@r1    = external global i64 ; assigned to register: s4
@r2    = external global i64 ; assigned to register: s5
@r3    = external global i64 ; assigned to register: s6
@r4    = external global i64 ; assigned to register: s7
@r5    = external global i64 ; assigned to register: s8
@r6    = external global i64 ; assigned to register: s9
@r7    = external global i64 ; assigned to register: s10
@splim = external global i64 ; assigned to register: s11

@f1 = external global float  ; assigned to register: fs0
@f2 = external global float  ; assigned to register: fs1
@f3 = external global float  ; assigned to register: fs2
@f4 = external global float  ; assigned to register: fs3
@f5 = external global float  ; assigned to register: fs4
@f6 = external global float  ; assigned to register: fs5

@d1 = external global double ; assigned to register: fs6
@d2 = external global double ; assigned to register: fs7
@d3 = external global double ; assigned to register: fs8
@d4 = external global double ; assigned to register: fs9
@d5 = external global double ; assigned to register: fs10
@d6 = external global double ; assigned to register: fs11

define ghccc void @foo() nounwind {
; CHECK-LABEL: foo:
; CHECK:       # %bb.0: # %entry
; CHECK-NEXT:    lui a0, %hi(d6)
; CHECK-NEXT:    fld fs11, %lo(d6)(a0)
; CHECK-NEXT:    lui a0, %hi(d5)
; CHECK-NEXT:    fld fs10, %lo(d5)(a0)
; CHECK-NEXT:    lui a0, %hi(d4)
; CHECK-NEXT:    fld fs9, %lo(d4)(a0)
; CHECK-NEXT:    lui a0, %hi(d3)
; CHECK-NEXT:    fld fs8, %lo(d3)(a0)
; CHECK-NEXT:    lui a0, %hi(d2)
; CHECK-NEXT:    fld fs7, %lo(d2)(a0)
; CHECK-NEXT:    lui a0, %hi(d1)
; CHECK-NEXT:    fld fs6, %lo(d1)(a0)
; CHECK-NEXT:    lui a0, %hi(f6)
; CHECK-NEXT:    flw fs5, %lo(f6)(a0)
; CHECK-NEXT:    lui a0, %hi(f5)
; CHECK-NEXT:    flw fs4, %lo(f5)(a0)
; CHECK-NEXT:    lui a0, %hi(f4)
; CHECK-NEXT:    flw fs3, %lo(f4)(a0)
; CHECK-NEXT:    lui a0, %hi(f3)
; CHECK-NEXT:    flw fs2, %lo(f3)(a0)
; CHECK-NEXT:    lui a0, %hi(f2)
; CHECK-NEXT:    flw fs1, %lo(f2)(a0)
; CHECK-NEXT:    lui a0, %hi(f1)
; CHECK-NEXT:    flw fs0, %lo(f1)(a0)
; CHECK-NEXT:    lui a0, %hi(splim)
; CHECK-NEXT:    ld s11, %lo(splim)(a0)
; CHECK-NEXT:    lui a0, %hi(r7)
; CHECK-NEXT:    ld s10, %lo(r7)(a0)
; CHECK-NEXT:    lui a0, %hi(r6)
; CHECK-NEXT:    ld s9, %lo(r6)(a0)
; CHECK-NEXT:    lui a0, %hi(r5)
; CHECK-NEXT:    ld s8, %lo(r5)(a0)
; CHECK-NEXT:    lui a0, %hi(r4)
; CHECK-NEXT:    ld s7, %lo(r4)(a0)
; CHECK-NEXT:    lui a0, %hi(r3)
; CHECK-NEXT:    ld s6, %lo(r3)(a0)
; CHECK-NEXT:    lui a0, %hi(r2)
; CHECK-NEXT:    ld s5, %lo(r2)(a0)
; CHECK-NEXT:    lui a0, %hi(r1)
; CHECK-NEXT:    ld s4, %lo(r1)(a0)
; CHECK-NEXT:    lui a0, %hi(hp)
; CHECK-NEXT:    ld s3, %lo(hp)(a0)
; CHECK-NEXT:    lui a0, %hi(sp)
; CHECK-NEXT:    ld s2, %lo(sp)(a0)
; CHECK-NEXT:    lui a0, %hi(base)
; CHECK-NEXT:    ld s1, %lo(base)(a0)
; CHECK-NEXT:    tail bar@plt
entry:
  %0  = load double, double* @d6
  %1  = load double, double* @d5
  %2  = load double, double* @d4
  %3  = load double, double* @d3
  %4  = load double, double* @d2
  %5  = load double, double* @d1
  %6  = load float, float* @f6
  %7  = load float, float* @f5
  %8  = load float, float* @f4
  %9  = load float, float* @f3
  %10 = load float, float* @f2
  %11 = load float, float* @f1
  %12 = load i64, i64* @splim
  %13 = load i64, i64* @r7
  %14 = load i64, i64* @r6
  %15 = load i64, i64* @r5
  %16 = load i64, i64* @r4
  %17 = load i64, i64* @r3
  %18 = load i64, i64* @r2
  %19 = load i64, i64* @r1
  %20 = load i64, i64* @hp
  %21 = load i64, i64* @sp
  %22 = load i64, i64* @base
  tail call ghccc void @bar(i64 %22, i64 %21, i64 %20, i64 %19, i64 %18, i64 %17, i64 %16, i64 %15, i64 %14, i64 %13, i64 %12,
                            float %11, float %10, float %9, float %8, float %7, float %6,
                            double %5, double %4, double %3, double %2, double %1, double %0) nounwind
  ret void
}

declare ghccc void @bar(i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, i64,
                        float, float, float, float, float, float,
                        double, double, double, double, double, double)