File: aarch64_fnmadd.ll

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (153 lines) | stat: -rw-r--r-- 4,465 bytes parent folder | download | duplicates (2)
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc < %s -mtriple=aarch64-linux-gnu -O3 -verify-machineinstrs | FileCheck %s

define void @fnmaddd(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: fnmaddd:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    ldr d0, [x1]
; CHECK-NEXT:    ldr d1, [x0]
; CHECK-NEXT:    ldr d2, [x2]
; CHECK-NEXT:    fnmadd d0, d0, d1, d2
; CHECK-NEXT:    str d0, [x0]
; CHECK-NEXT:    ret
entry:
  %0 = load double, ptr %a, align 8
  %1 = load double, ptr %b, align 8
  %mul = fmul fast double %1, %0
  %2 = load double, ptr %c, align 8
  %add = fadd fast double %mul, %2
  %fneg = fneg fast double %add
  store double %fneg, ptr %a, align 8
  ret void
}

; Don't combine: No flags
define void @fnmaddd_no_fast(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: fnmaddd_no_fast:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    ldr d0, [x0]
; CHECK-NEXT:    ldr d1, [x1]
; CHECK-NEXT:    fmul d0, d1, d0
; CHECK-NEXT:    ldr d1, [x2]
; CHECK-NEXT:    fadd d0, d0, d1
; CHECK-NEXT:    fneg d0, d0
; CHECK-NEXT:    str d0, [x0]
; CHECK-NEXT:    ret
entry:
  %0 = load double, ptr %a, align 8
  %1 = load double, ptr %b, align 8
  %mul = fmul double %1, %0
  %2 = load double, ptr %c, align 8
  %add = fadd double %mul, %2
  %fneg = fneg double %add
  store double %fneg, ptr %a, align 8
  ret void
}

define void @fnmadds(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: fnmadds:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    ldr s0, [x1]
; CHECK-NEXT:    ldr s1, [x0]
; CHECK-NEXT:    ldr s2, [x2]
; CHECK-NEXT:    fnmadd s0, s0, s1, s2
; CHECK-NEXT:    str s0, [x0]
; CHECK-NEXT:    ret
entry:
  %0 = load float, ptr %a, align 4
  %1 = load float, ptr %b, align 4
  %mul = fmul fast float %1, %0
  %2 = load float, ptr %c, align 4
  %add = fadd fast float %mul, %2
  %fneg = fneg fast float %add
  store float %fneg, ptr %a, align 4
  ret void
}

define void @fnmadds_nsz_contract(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: fnmadds_nsz_contract:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    ldr s0, [x1]
; CHECK-NEXT:    ldr s1, [x0]
; CHECK-NEXT:    ldr s2, [x2]
; CHECK-NEXT:    fnmadd s0, s0, s1, s2
; CHECK-NEXT:    str s0, [x0]
; CHECK-NEXT:    ret
entry:
  %0 = load float, ptr %a, align 4
  %1 = load float, ptr %b, align 4
  %mul = fmul contract nsz float %1, %0
  %2 = load float, ptr %c, align 4
  %add = fadd contract nsz float %mul, %2
  %fneg = fneg contract nsz float %add
  store float %fneg, ptr %a, align 4
  ret void
}

; Don't combine: Missing nsz
define void @fnmadds_contract(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: fnmadds_contract:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    ldr s0, [x1]
; CHECK-NEXT:    ldr s1, [x0]
; CHECK-NEXT:    ldr s2, [x2]
; CHECK-NEXT:    fmadd s0, s0, s1, s2
; CHECK-NEXT:    fneg s0, s0
; CHECK-NEXT:    str s0, [x0]
; CHECK-NEXT:    ret
entry:
  %0 = load float, ptr %a, align 4
  %1 = load float, ptr %b, align 4
  %mul = fmul contract float %1, %0
  %2 = load float, ptr %c, align 4
  %add = fadd contract float %mul, %2
  %fneg = fneg contract float %add
  store float %fneg, ptr %a, align 4
  ret void
}

; Don't combine: Missing contract
define void @fnmadds_nsz(ptr %a, ptr %b, ptr %c) {
; CHECK-LABEL: fnmadds_nsz:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    ldr s0, [x0]
; CHECK-NEXT:    ldr s1, [x1]
; CHECK-NEXT:    fmul s0, s1, s0
; CHECK-NEXT:    ldr s1, [x2]
; CHECK-NEXT:    fadd s0, s0, s1
; CHECK-NEXT:    fneg s0, s0
; CHECK-NEXT:    str s0, [x0]
; CHECK-NEXT:    ret
entry:
  %0 = load float, ptr %a, align 4
  %1 = load float, ptr %b, align 4
  %mul = fmul nsz float %1, %0
  %2 = load float, ptr %c, align 4
  %add = fadd nsz float %mul, %2
  %fneg = fneg nsz float %add
  store float %fneg, ptr %a, align 4
  ret void
}

define void @fnmaddd_two_uses(ptr %a, ptr %b, ptr %c, ptr %d) {
; CHECK-LABEL: fnmaddd_two_uses:
; CHECK:       // %bb.0: // %entry
; CHECK-NEXT:    ldr d0, [x1]
; CHECK-NEXT:    ldr d1, [x0]
; CHECK-NEXT:    ldr d2, [x2]
; CHECK-NEXT:    fmadd d0, d0, d1, d2
; CHECK-NEXT:    fneg d1, d0
; CHECK-NEXT:    str d1, [x0]
; CHECK-NEXT:    str d0, [x3]
; CHECK-NEXT:    ret
entry:
  %0 = load double, ptr %a, align 8
  %1 = load double, ptr %b, align 8
  %mul = fmul fast double %1, %0
  %2 = load double, ptr %c, align 8
  %add = fadd fast double %mul, %2
  %fneg1 = fneg fast double %add
  store double %fneg1, ptr %a, align 8
  store double %add, ptr %d, align 8
  ret void
}