1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -mcpu=mips32 < %s | FileCheck %s -check-prefixes=ALL,32-NOFPXX 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -mcpu=mips32 -mattr=fpxx < %s | FileCheck %s -check-prefixes=ALL,32-FPXX 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -mcpu=mips32r2 < %s | FileCheck %s -check-prefixes=ALL,32R2-NOFPXX 5*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mipsel -mcpu=mips32r2 -mattr=fpxx < %s | FileCheck %s -check-prefixes=ALL,32R2-FPXX 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -mcpu=mips4 < %s | FileCheck %s -check-prefixes=ALL,4-NOFPXX 8*9880d681SAndroid Build Coastguard Worker; RUN: not llc -march=mips64 -mcpu=mips4 -mattr=fpxx < %s 2>&1 | FileCheck %s -check-prefix=4-FPXX 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64 -mcpu=mips64 < %s | FileCheck %s -check-prefixes=ALL,64-NOFPXX 11*9880d681SAndroid Build Coastguard Worker; RUN: not llc -march=mips64 -mcpu=mips64 -mattr=fpxx < %s 2>&1 | FileCheck %s -check-prefix=64-FPXX 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64 -mcpu=mips4 -target-abi o32 < %s | FileCheck %s -check-prefixes=ALL,4-O32-NOFPXX 14*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64 -mcpu=mips4 -target-abi o32 -mattr=fpxx < %s | FileCheck %s -check-prefixes=ALL,4-O32-FPXX 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64 -mcpu=mips64 -target-abi o32 < %s | FileCheck %s -check-prefixes=ALL,64-O32-NOFPXX 17*9880d681SAndroid Build Coastguard Worker; RUN-TODO: llc -march=mips64 -mcpu=mips64 -target-abi o32 -mattr=fpxx < %s | FileCheck %s -check-prefixes=ALL,64-O32-FPXX 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdeclare double @dbl(); 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; 4-FPXX: LLVM ERROR: FPXX is not permitted for the N32/N64 ABI's. 22*9880d681SAndroid Build Coastguard Worker; 64-FPXX: LLVM ERROR: FPXX is not permitted for the N32/N64 ABI's. 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine double @test1(double %d, ...) { 25*9880d681SAndroid Build Coastguard Worker ret double %d 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test1: 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $4, $f0 30*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $5, $f1 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; 32-FPXX: addiu $sp, $sp, -8 33*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $4, 0($sp) 34*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $5, 4($sp) 35*9880d681SAndroid Build Coastguard Worker; 32-FPXX: ldc1 $f0, 0($sp) 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mtc1 $4, $f0 38*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mthc1 $5, $f0 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mtc1 $4, $f0 41*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mthc1 $5, $f0 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; floats/doubles are not passed in integer registers for n64, so dmtc1 is not used. 44*9880d681SAndroid Build Coastguard Worker; 4-NOFPXX: mov.d $f0, $f12 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker; 64-NOFPXX: mov.d $f0, $f12 47*9880d681SAndroid Build Coastguard Worker} 48*9880d681SAndroid Build Coastguard Worker 49*9880d681SAndroid Build Coastguard Workerdefine double @test2(i32 %i, double %d) { 50*9880d681SAndroid Build Coastguard Worker ret double %d 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test2: 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $6, $f0 55*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $7, $f1 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker; 32-FPXX: addiu $sp, $sp, -8 58*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $6, 0($sp) 59*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $7, 4($sp) 60*9880d681SAndroid Build Coastguard Worker; 32-FPXX: ldc1 $f0, 0($sp) 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mtc1 $6, $f0 63*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mthc1 $7, $f0 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mtc1 $6, $f0 66*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mthc1 $7, $f0 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker; 4-NOFPXX: mov.d $f0, $f13 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Worker; 64-NOFPXX: mov.d $f0, $f13 71*9880d681SAndroid Build Coastguard Worker} 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Workerdefine double @test3(float %f1, float %f2, double %d) { 74*9880d681SAndroid Build Coastguard Worker ret double %d 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test3: 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $6, $f0 79*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $7, $f1 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Worker; 32-FPXX: addiu $sp, $sp, -8 82*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $6, 0($sp) 83*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $7, 4($sp) 84*9880d681SAndroid Build Coastguard Worker; 32-FPXX: ldc1 $f0, 0($sp) 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mtc1 $6, $f0 87*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mthc1 $7, $f0 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mtc1 $6, $f0 90*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mthc1 $7, $f0 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker; 4-NOFPXX: mov.d $f0, $f14 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker; 64-NOFPXX: mov.d $f0, $f14 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine double @test4(float %f, double %d, ...) { 98*9880d681SAndroid Build Coastguard Worker ret double %d 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test4: 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $6, $f0 103*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $7, $f1 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; 32-FPXX: addiu $sp, $sp, -8 106*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $6, 0($sp) 107*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $7, 4($sp) 108*9880d681SAndroid Build Coastguard Worker; 32-FPXX: ldc1 $f0, 0($sp) 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mtc1 $6, $f0 111*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mthc1 $7, $f0 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mtc1 $6, $f0 114*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mthc1 $7, $f0 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker; 4-NOFPXX: mov.d $f0, $f13 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; 64-NOFPXX: mov.d $f0, $f13 119*9880d681SAndroid Build Coastguard Worker} 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerdefine double @test5() { 122*9880d681SAndroid Build Coastguard Worker ret double 0.000000e+00 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test5: 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $zero, $f0 127*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: mtc1 $zero, $f1 128*9880d681SAndroid Build Coastguard Worker 129*9880d681SAndroid Build Coastguard Worker; 32-FPXX: addiu $sp, $sp, -8 130*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $zero, 0($sp) 131*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $zero, 4($sp) 132*9880d681SAndroid Build Coastguard Worker; 32-FPXX: ldc1 $f0, 0($sp) 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mtc1 $zero, $f0 135*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: mthc1 $zero, $f0 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mtc1 $zero, $f0 138*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: mthc1 $zero, $f0 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker; 4-NOFPXX: dmtc1 $zero, $f0 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker; 64-NOFPXX: dmtc1 $zero, $f0 143*9880d681SAndroid Build Coastguard Worker} 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerdefine double @test6(double %a, double %b, ...) { 146*9880d681SAndroid Build Coastguard Worker %1 = fsub double %a, %b 147*9880d681SAndroid Build Coastguard Worker ret double %1 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: test6: 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX-DAG: mtc1 $4, $[[T0:f[0-9]+]] 152*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX-DAG: mtc1 $5, ${{f[0-9]*[13579]}} 153*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX-DAG: mtc1 $6, $[[T1:f[0-9]+]] 154*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX-DAG: mtc1 $7, ${{f[0-9]*[13579]}} 155*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX: sub.d $f0, $[[T0]], $[[T1]] 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; 32-FPXX: addiu $sp, $sp, -8 158*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $6, 0($sp) 159*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $7, 4($sp) 160*9880d681SAndroid Build Coastguard Worker; 32-FPXX: ldc1 $[[T1:f[0-9]+]], 0($sp) 161*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $4, 0($sp) 162*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sw $5, 4($sp) 163*9880d681SAndroid Build Coastguard Worker; 32-FPXX: ldc1 $[[T0:f[0-9]+]], 0($sp) 164*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sub.d $f0, $[[T0]], $[[T1]] 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX-DAG: mtc1 $4, $[[T0:f[0-9]+]] 167*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX-DAG: mthc1 $5, $[[T0]] 168*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX-DAG: mtc1 $6, $[[T1:f[0-9]+]] 169*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX-DAG: mthc1 $7, $[[T1]] 170*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX: sub.d $f0, $[[T0]], $[[T1]] 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX-DAG: mtc1 $4, $[[T0:f[0-9]+]] 173*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX-DAG: mthc1 $5, $[[T0]] 174*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX-DAG: mtc1 $6, $[[T1:f[0-9]+]] 175*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX-DAG: mthc1 $7, $[[T1]] 176*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX: sub.d $f0, $[[T0]], $[[T1]] 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; floats/doubles are not passed in integer registers for n64, so dmtc1 is not used. 179*9880d681SAndroid Build Coastguard Worker; 4-NOFPXX: sub.d $f0, $f12, $f13 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Worker; floats/doubles are not passed in integer registers for n64, so dmtc1 is not used. 182*9880d681SAndroid Build Coastguard Worker; 64-NOFPXX: sub.d $f0, $f12, $f13 183*9880d681SAndroid Build Coastguard Worker} 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerdefine double @move_from1(double %d) { 186*9880d681SAndroid Build Coastguard Worker %1 = call double @dbl() 187*9880d681SAndroid Build Coastguard Worker %2 = call double @test2(i32 0, double %1) 188*9880d681SAndroid Build Coastguard Worker ret double %2 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: move_from1: 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX-DAG: mfc1 $6, $f0 193*9880d681SAndroid Build Coastguard Worker; 32-NOFPXX-DAG: mfc1 $7, $f1 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker; 32-FPXX: addiu $sp, $sp, -32 196*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sdc1 $f0, 16($sp) 197*9880d681SAndroid Build Coastguard Worker; 32-FPXX: lw $6, 16($sp) 198*9880d681SAndroid Build Coastguard Worker; FIXME: This store is redundant 199*9880d681SAndroid Build Coastguard Worker; 32-FPXX: sdc1 $f0, 16($sp) 200*9880d681SAndroid Build Coastguard Worker; 32-FPXX: lw $7, 20($sp) 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX-DAG: mfc1 $6, $f0 203*9880d681SAndroid Build Coastguard Worker; 32R2-NOFPXX-DAG: mfhc1 $7, $f0 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX-DAG: mfc1 $6, $f0 206*9880d681SAndroid Build Coastguard Worker; 32R2-FPXX-DAG: mfhc1 $7, $f0 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; floats/doubles are not passed in integer registers for n64, so dmfc1 is not used. 209*9880d681SAndroid Build Coastguard Worker; We can't use inline assembly to force a copy either because trying to force 210*9880d681SAndroid Build Coastguard Worker; a copy to a GPR this way fails with ; "couldn't allocate input reg for 211*9880d681SAndroid Build Coastguard Worker; constraint 'r'". It therefore seems impossible to test the generation of dmfc1 212*9880d681SAndroid Build Coastguard Worker; in a simple test. 213*9880d681SAndroid Build Coastguard Worker; 4-NOFPXX: mov.d $f13, $f0 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker; floats/doubles are not passed in integer registers for n64, so dmfc1 is not used. 216*9880d681SAndroid Build Coastguard Worker; We can't use inline assembly to force a copy either because trying to force 217*9880d681SAndroid Build Coastguard Worker; a copy to a GPR this way fails with ; "couldn't allocate input reg for 218*9880d681SAndroid Build Coastguard Worker; constraint 'r'". It therefore seems impossible to test the generation of dmfc1 219*9880d681SAndroid Build Coastguard Worker; in a simple test. 220*9880d681SAndroid Build Coastguard Worker; 64-NOFPXX: mov.d $f13, $f0 221*9880d681SAndroid Build Coastguard Worker} 222