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 ; FP64-LABEL: name: float_in_fpr 16 ; FP64: bb.1.entry: 17 ; FP64-NEXT: liveins: $f12, $f14 18 ; FP64-NEXT: {{ $}} 19 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f12 20 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f14 21 ; FP64-NEXT: $f0 = COPY [[COPY1]](s32) 22 ; FP64-NEXT: RetRA implicit $f0 23entry: 24 ret float %b 25} 26 27define double @double_in_fpr(double %a, double %b) { 28 ; FP32-LABEL: name: double_in_fpr 29 ; FP32: bb.1.entry: 30 ; FP32-NEXT: liveins: $d6, $d7 31 ; FP32-NEXT: {{ $}} 32 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d6 33 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $d7 34 ; FP32-NEXT: $d0 = COPY [[COPY1]](s64) 35 ; FP32-NEXT: RetRA implicit $d0 36 ; FP64-LABEL: name: double_in_fpr 37 ; FP64: bb.1.entry: 38 ; FP64-NEXT: liveins: $d12_64, $d14_64 39 ; FP64-NEXT: {{ $}} 40 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d12_64 41 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $d14_64 42 ; FP64-NEXT: $d0_64 = COPY [[COPY1]](s64) 43 ; FP64-NEXT: RetRA implicit $d0_64 44entry: 45 ret double %b 46} 47 48define float @float_in_gpr(i32 %a, float %b) { 49 ; FP32-LABEL: name: float_in_gpr 50 ; FP32: bb.1.entry: 51 ; FP32-NEXT: liveins: $a0, $a1 52 ; FP32-NEXT: {{ $}} 53 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 54 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 55 ; FP32-NEXT: $f0 = COPY [[COPY1]](s32) 56 ; FP32-NEXT: RetRA implicit $f0 57 ; FP64-LABEL: name: float_in_gpr 58 ; FP64: bb.1.entry: 59 ; FP64-NEXT: liveins: $a0, $a1 60 ; FP64-NEXT: {{ $}} 61 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 62 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 63 ; FP64-NEXT: $f0 = COPY [[COPY1]](s32) 64 ; FP64-NEXT: RetRA implicit $f0 65entry: 66 ret float %b 67} 68 69define double @double_in_gpr(i32 %a, double %b) { 70 ; FP32-LABEL: name: double_in_gpr 71 ; FP32: bb.1.entry: 72 ; FP32-NEXT: liveins: $a0, $a2, $a3 73 ; FP32-NEXT: {{ $}} 74 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 75 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 76 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 77 ; FP32-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 78 ; FP32-NEXT: $d0 = COPY [[MV]](s64) 79 ; FP32-NEXT: RetRA implicit $d0 80 ; FP64-LABEL: name: double_in_gpr 81 ; FP64: bb.1.entry: 82 ; FP64-NEXT: liveins: $a0, $a2, $a3 83 ; FP64-NEXT: {{ $}} 84 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 85 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 86 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 87 ; FP64-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 88 ; FP64-NEXT: $d0_64 = COPY [[MV]](s64) 89 ; FP64-NEXT: RetRA implicit $d0_64 90entry: 91 ret double %b 92} 93 94define float @call_float_in_fpr(float %a, float %b) { 95 ; FP32-LABEL: name: call_float_in_fpr 96 ; FP32: bb.1.entry: 97 ; FP32-NEXT: liveins: $f12, $f14 98 ; FP32-NEXT: {{ $}} 99 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f12 100 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f14 101 ; FP32-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 102 ; FP32-NEXT: $f12 = COPY [[COPY]](s32) 103 ; FP32-NEXT: $f14 = COPY [[COPY1]](s32) 104 ; FP32-NEXT: JAL @float_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0 105 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $f0 106 ; FP32-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 107 ; FP32-NEXT: $f0 = COPY [[COPY2]](s32) 108 ; FP32-NEXT: RetRA implicit $f0 109 ; FP64-LABEL: name: call_float_in_fpr 110 ; FP64: bb.1.entry: 111 ; FP64-NEXT: liveins: $f12, $f14 112 ; FP64-NEXT: {{ $}} 113 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f12 114 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f14 115 ; FP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 116 ; FP64-NEXT: $f12 = COPY [[COPY]](s32) 117 ; FP64-NEXT: $f14 = COPY [[COPY1]](s32) 118 ; FP64-NEXT: JAL @float_in_fpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $f12, implicit $f14, implicit-def $f0 119 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $f0 120 ; FP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 121 ; FP64-NEXT: $f0 = COPY [[COPY2]](s32) 122 ; FP64-NEXT: RetRA implicit $f0 123entry: 124 %call = call float @float_in_fpr(float %a, float %b) 125 ret float %call 126} 127 128define double @call_double_in_fpr(double %a, double %b) { 129 ; FP32-LABEL: name: call_double_in_fpr 130 ; FP32: bb.1.entry: 131 ; FP32-NEXT: liveins: $d6, $d7 132 ; FP32-NEXT: {{ $}} 133 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d6 134 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $d7 135 ; FP32-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 136 ; FP32-NEXT: $d6 = COPY [[COPY]](s64) 137 ; FP32-NEXT: $d7 = COPY [[COPY1]](s64) 138 ; FP32-NEXT: JAL @double_in_fpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $d6, implicit $d7, implicit-def $d0 139 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $d0 140 ; FP32-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 141 ; FP32-NEXT: $d0 = COPY [[COPY2]](s64) 142 ; FP32-NEXT: RetRA implicit $d0 143 ; FP64-LABEL: name: call_double_in_fpr 144 ; FP64: bb.1.entry: 145 ; FP64-NEXT: liveins: $d12_64, $d14_64 146 ; FP64-NEXT: {{ $}} 147 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $d12_64 148 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $d14_64 149 ; FP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 150 ; FP64-NEXT: $d12_64 = COPY [[COPY]](s64) 151 ; FP64-NEXT: $d14_64 = COPY [[COPY1]](s64) 152 ; 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 153 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s64) = COPY $d0_64 154 ; FP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 155 ; FP64-NEXT: $d0_64 = COPY [[COPY2]](s64) 156 ; FP64-NEXT: RetRA implicit $d0_64 157entry: 158 %call = call double @double_in_fpr(double %a, double %b) 159 ret double %call 160} 161 162define float @call_float_in_gpr(i32 %a, float %b) { 163 ; FP32-LABEL: name: call_float_in_gpr 164 ; FP32: bb.1.entry: 165 ; FP32-NEXT: liveins: $a0, $a1 166 ; FP32-NEXT: {{ $}} 167 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 168 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 169 ; FP32-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 170 ; FP32-NEXT: $a0 = COPY [[COPY]](s32) 171 ; FP32-NEXT: $a1 = COPY [[COPY1]](s32) 172 ; FP32-NEXT: JAL @float_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit $a1, implicit-def $f0 173 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $f0 174 ; FP32-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 175 ; FP32-NEXT: $f0 = COPY [[COPY2]](s32) 176 ; FP32-NEXT: RetRA implicit $f0 177 ; FP64-LABEL: name: call_float_in_gpr 178 ; FP64: bb.1.entry: 179 ; FP64-NEXT: liveins: $a0, $a1 180 ; FP64-NEXT: {{ $}} 181 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 182 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a1 183 ; FP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 184 ; FP64-NEXT: $a0 = COPY [[COPY]](s32) 185 ; FP64-NEXT: $a1 = COPY [[COPY1]](s32) 186 ; FP64-NEXT: JAL @float_in_gpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $a0, implicit $a1, implicit-def $f0 187 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $f0 188 ; FP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 189 ; FP64-NEXT: $f0 = COPY [[COPY2]](s32) 190 ; FP64-NEXT: RetRA implicit $f0 191entry: 192 %call = call float @float_in_gpr(i32 %a, float %b) 193 ret float %call 194} 195 196 197define double @call_double_in_gpr(i32 %a, double %b) { 198 ; FP32-LABEL: name: call_double_in_gpr 199 ; FP32: bb.1.entry: 200 ; FP32-NEXT: liveins: $a0, $a2, $a3 201 ; FP32-NEXT: {{ $}} 202 ; FP32-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 203 ; FP32-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 204 ; FP32-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 205 ; FP32-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 206 ; FP32-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 207 ; FP32-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64) 208 ; FP32-NEXT: $a0 = COPY [[COPY]](s32) 209 ; FP32-NEXT: $a2 = COPY [[UV]](s32) 210 ; FP32-NEXT: $a3 = COPY [[UV1]](s32) 211 ; FP32-NEXT: JAL @double_in_gpr, csr_o32, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0 212 ; FP32-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $d0 213 ; FP32-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 214 ; FP32-NEXT: $d0 = COPY [[COPY3]](s64) 215 ; FP32-NEXT: RetRA implicit $d0 216 ; FP64-LABEL: name: call_double_in_gpr 217 ; FP64: bb.1.entry: 218 ; FP64-NEXT: liveins: $a0, $a2, $a3 219 ; FP64-NEXT: {{ $}} 220 ; FP64-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $a0 221 ; FP64-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $a2 222 ; FP64-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $a3 223 ; FP64-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32) 224 ; FP64-NEXT: ADJCALLSTACKDOWN 16, 0, implicit-def $sp, implicit $sp 225 ; FP64-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[MV]](s64) 226 ; FP64-NEXT: $a0 = COPY [[COPY]](s32) 227 ; FP64-NEXT: $a2 = COPY [[UV]](s32) 228 ; FP64-NEXT: $a3 = COPY [[UV1]](s32) 229 ; FP64-NEXT: JAL @double_in_gpr, csr_o32_fp64, implicit-def $ra, implicit-def $sp, implicit $a0, implicit-def $d0_64 230 ; FP64-NEXT: [[COPY3:%[0-9]+]]:_(s64) = COPY $d0_64 231 ; FP64-NEXT: ADJCALLSTACKUP 16, 0, implicit-def $sp, implicit $sp 232 ; FP64-NEXT: $d0_64 = COPY [[COPY3]](s64) 233 ; FP64-NEXT: RetRA implicit $d0_64 234entry: 235 %call = call double @double_in_gpr(i32 %a, double %b) 236 ret double %call 237} 238