1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2 3; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=FP32 4; RUN: llc -O0 -mtriple=mipsel-linux-gnu -mattr=+fp64,+mips32r2 -global-isel -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=FP64 5 6define float @float_in_fpr(float %a, float %b) { 7 ; FP32-LABEL: name: float_in_fpr 8 ; FP32: bb.1.entry: 9 ; FP32-NEXT: liveins: $f12, $f14 10 ; FP32-NEXT: {{ $}} 11 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f12 12 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f14 13 ; FP32-NEXT: $f0 = COPY [[COPY1]](s32) 14 ; FP32-NEXT: RetRA implicit $f0 15 ; 16 ; FP64-LABEL: name: float_in_fpr 17 ; FP64: bb.1.entry: 18 ; FP64-NEXT: liveins: $f12, $f14 19 ; FP64-NEXT: {{ $}} 20 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f12 21 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f14 22 ; FP64-NEXT: $f0 = COPY [[COPY1]](s32) 23 ; FP64-NEXT: RetRA implicit $f0 24entry: 25 ret float %b 26} 27 28define double @double_in_fpr(double %a, double %b) { 29 ; FP32-LABEL: name: double_in_fpr 30 ; FP32: bb.1.entry: 31 ; FP32-NEXT: liveins: $d6, $d7 32 ; FP32-NEXT: {{ $}} 33 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d6 34 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $d7 35 ; FP32-NEXT: $d0 = COPY [[COPY1]](s64) 36 ; FP32-NEXT: RetRA implicit $d0 37 ; 38 ; FP64-LABEL: name: double_in_fpr 39 ; FP64: bb.1.entry: 40 ; FP64-NEXT: liveins: $d12_64, $d14_64 41 ; FP64-NEXT: {{ $}} 42 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d12_64 43 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $d14_64 44 ; FP64-NEXT: $d0_64 = COPY [[COPY1]](s64) 45 ; FP64-NEXT: RetRA implicit $d0_64 46entry: 47 ret double %b 48} 49 50define float @float_in_gpr(i32 %a, float %b) { 51 ; FP32-LABEL: name: float_in_gpr 52 ; FP32: bb.1.entry: 53 ; FP32-NEXT: liveins: $a0, $a1 54 ; FP32-NEXT: {{ $}} 55 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 56 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 57 ; FP32-NEXT: $f0 = COPY [[COPY1]](s32) 58 ; FP32-NEXT: RetRA implicit $f0 59 ; 60 ; FP64-LABEL: name: float_in_gpr 61 ; FP64: bb.1.entry: 62 ; FP64-NEXT: liveins: $a0, $a1 63 ; FP64-NEXT: {{ $}} 64 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 65 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 66 ; FP64-NEXT: $f0 = COPY [[COPY1]](s32) 67 ; FP64-NEXT: RetRA implicit $f0 68entry: 69 ret float %b 70} 71 72define double @double_in_gpr(i32 %a, double %b) { 73 ; FP32-LABEL: name: double_in_gpr 74 ; FP32: bb.1.entry: 75 ; FP32-NEXT: liveins: $a0, $a2, $a3 76 ; FP32-NEXT: {{ $}} 77 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 78 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 79 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 80 ; FP32-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 81 ; FP32-NEXT: $d0 = COPY [[MV]](s64) 82 ; FP32-NEXT: RetRA implicit $d0 83 ; 84 ; FP64-LABEL: name: double_in_gpr 85 ; FP64: bb.1.entry: 86 ; FP64-NEXT: liveins: $a0, $a2, $a3 87 ; FP64-NEXT: {{ $}} 88 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 89 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 90 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 91 ; FP64-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 92 ; FP64-NEXT: $d0_64 = COPY [[MV]](s64) 93 ; FP64-NEXT: RetRA implicit $d0_64 94entry: 95 ret double %b 96} 97 98define double @two_double_in_gpr(i32 %a, double %b, double %c) { 99 ; FP32-LABEL: name: two_double_in_gpr 100 ; FP32: bb.1.entry: 101 ; FP32-NEXT: liveins: $a0, $a2, $a3 102 ; FP32-NEXT: {{ $}} 103 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 104 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 105 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 106 ; FP32-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 107 ; FP32-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0 108 ; FP32-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.0) 109 ; FP32-NEXT: $d0 = COPY [[LOAD]](s64) 110 ; FP32-NEXT: RetRA implicit $d0 111 ; 112 ; FP64-LABEL: name: two_double_in_gpr 113 ; FP64: bb.1.entry: 114 ; FP64-NEXT: liveins: $a0, $a2, $a3 115 ; FP64-NEXT: {{ $}} 116 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 117 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 118 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 119 ; FP64-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 120 ; FP64-NEXT: [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.0 121 ; FP64-NEXT: [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (load (s64) from %fixed-stack.0) 122 ; FP64-NEXT: $d0_64 = COPY [[LOAD]](s64) 123 ; FP64-NEXT: RetRA implicit $d0_64 124entry: 125 ret double %c 126} 127 128define float @call_float_in_fpr(float %a, float %b) { 129 ; FP32-LABEL: name: call_float_in_fpr 130 ; FP32: bb.1.entry: 131 ; FP32-NEXT: liveins: $f12, $f14 132 ; FP32-NEXT: {{ $}} 133 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f12 134 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f14 135 ; FP32-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 136 ; FP32-NEXT: $f12 = COPY [[COPY]](s32) 137 ; FP32-NEXT: $f14 = COPY [[COPY1]](s32) 138 ; FP32-NEXT: JAL @float_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0 139 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $f0 140 ; FP32-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 141 ; FP32-NEXT: $f0 = COPY [[COPY2]](s32) 142 ; FP32-NEXT: RetRA implicit $f0 143 ; 144 ; FP64-LABEL: name: call_float_in_fpr 145 ; FP64: bb.1.entry: 146 ; FP64-NEXT: liveins: $f12, $f14 147 ; FP64-NEXT: {{ $}} 148 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f12 149 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f14 150 ; FP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 151 ; FP64-NEXT: $f12 = COPY [[COPY]](s32) 152 ; FP64-NEXT: $f14 = COPY [[COPY1]](s32) 153 ; FP64-NEXT: JAL @float_in_fpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0 154 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $f0 155 ; FP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 156 ; FP64-NEXT: $f0 = COPY [[COPY2]](s32) 157 ; FP64-NEXT: RetRA implicit $f0 158entry: 159 %call = call float @float_in_fpr(float %a, float %b) 160 ret float %call 161} 162 163define double @call_double_in_fpr(double %a, double %b) { 164 ; FP32-LABEL: name: call_double_in_fpr 165 ; FP32: bb.1.entry: 166 ; FP32-NEXT: liveins: $d6, $d7 167 ; FP32-NEXT: {{ $}} 168 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d6 169 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $d7 170 ; FP32-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 171 ; FP32-NEXT: $d6 = COPY [[COPY]](s64) 172 ; FP32-NEXT: $d7 = COPY [[COPY1]](s64) 173 ; FP32-NEXT: JAL @double_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $d6, implicit $d7, implicit-def $d0 174 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $d0 175 ; FP32-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 176 ; FP32-NEXT: $d0 = COPY [[COPY2]](s64) 177 ; FP32-NEXT: RetRA implicit $d0 178 ; 179 ; FP64-LABEL: name: call_double_in_fpr 180 ; FP64: bb.1.entry: 181 ; FP64-NEXT: liveins: $d12_64, $d14_64 182 ; FP64-NEXT: {{ $}} 183 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d12_64 184 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $d14_64 185 ; FP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 186 ; FP64-NEXT: $d12_64 = COPY [[COPY]](s64) 187 ; FP64-NEXT: $d14_64 = COPY [[COPY1]](s64) 188 ; FP64-NEXT: JAL @double_in_fpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $d12_64, implicit $d14_64, implicit-def $d0_64 189 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $d0_64 190 ; FP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 191 ; FP64-NEXT: $d0_64 = COPY [[COPY2]](s64) 192 ; FP64-NEXT: RetRA implicit $d0_64 193entry: 194 %call = call double @double_in_fpr(double %a, double %b) 195 ret double %call 196} 197 198define float @call_float_in_gpr(i32 %a, float %b) { 199 ; FP32-LABEL: name: call_float_in_gpr 200 ; FP32: bb.1.entry: 201 ; FP32-NEXT: liveins: $a0, $a1 202 ; FP32-NEXT: {{ $}} 203 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 204 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 205 ; FP32-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 206 ; FP32-NEXT: $a0 = COPY [[COPY]](s32) 207 ; FP32-NEXT: $a1 = COPY [[COPY1]](s32) 208 ; FP32-NEXT: JAL @float_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit $a1, implicit-def $f0 209 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $f0 210 ; FP32-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 211 ; FP32-NEXT: $f0 = COPY [[COPY2]](s32) 212 ; FP32-NEXT: RetRA implicit $f0 213 ; 214 ; FP64-LABEL: name: call_float_in_gpr 215 ; FP64: bb.1.entry: 216 ; FP64-NEXT: liveins: $a0, $a1 217 ; FP64-NEXT: {{ $}} 218 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 219 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 220 ; FP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 221 ; FP64-NEXT: $a0 = COPY [[COPY]](s32) 222 ; FP64-NEXT: $a1 = COPY [[COPY1]](s32) 223 ; FP64-NEXT: JAL @float_in_gpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $a0, implicit $a1, implicit-def $f0 224 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $f0 225 ; FP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 226 ; FP64-NEXT: $f0 = COPY [[COPY2]](s32) 227 ; FP64-NEXT: RetRA implicit $f0 228entry: 229 %call = call float @float_in_gpr(i32 %a, float %b) 230 ret float %call 231} 232 233 234define double @call_double_in_gpr(i32 %a, double %b) { 235 ; FP32-LABEL: name: call_double_in_gpr 236 ; FP32: bb.1.entry: 237 ; FP32-NEXT: liveins: $a0, $a2, $a3 238 ; FP32-NEXT: {{ $}} 239 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 240 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 241 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 242 ; FP32-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 243 ; FP32-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 244 ; FP32-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64) 245 ; FP32-NEXT: $a0 = COPY [[COPY]](s32) 246 ; FP32-NEXT: $a2 = COPY [[UV]](s32) 247 ; FP32-NEXT: $a3 = COPY [[UV1]](s32) 248 ; FP32-NEXT: JAL @double_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0 249 ; FP32-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $d0 250 ; FP32-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 251 ; FP32-NEXT: $d0 = COPY [[COPY3]](s64) 252 ; FP32-NEXT: RetRA implicit $d0 253 ; 254 ; FP64-LABEL: name: call_double_in_gpr 255 ; FP64: bb.1.entry: 256 ; FP64-NEXT: liveins: $a0, $a2, $a3 257 ; FP64-NEXT: {{ $}} 258 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 259 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 260 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 261 ; FP64-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 262 ; FP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 263 ; FP64-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64) 264 ; FP64-NEXT: $a0 = COPY [[COPY]](s32) 265 ; FP64-NEXT: $a2 = COPY [[UV]](s32) 266 ; FP64-NEXT: $a3 = COPY [[UV1]](s32) 267 ; FP64-NEXT: JAL @double_in_gpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0_64 268 ; FP64-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $d0_64 269 ; FP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 270 ; FP64-NEXT: $d0_64 = COPY [[COPY3]](s64) 271 ; FP64-NEXT: RetRA implicit $d0_64 272entry: 273 %call = call double @double_in_gpr(i32 %a, double %b) 274 ret double %call 275} 276