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