1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -O0 -mtriple=mipsel-linux-gnu -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32,FP32 3; RUN: llc -O0 -mtriple=mipsel-linux-gnu -mattr=+fp64,+mips32r2 -global-isel -verify-machineinstrs %s -o -| FileCheck %s -check-prefixes=MIPS32,FP64 4 5define float @float_in_fpr(float %a, float %b) { 6; MIPS32-LABEL: float_in_fpr: 7; MIPS32: # %bb.0: # %entry 8; MIPS32-NEXT: mov.s $f0, $f14 9; MIPS32-NEXT: jr $ra 10; MIPS32-NEXT: nop 11entry: 12 ret float %b 13} 14 15define double @double_in_fpr(double %a, double %b) { 16; MIPS32-LABEL: double_in_fpr: 17; MIPS32: # %bb.0: # %entry 18; MIPS32-NEXT: mov.d $f0, $f14 19; MIPS32-NEXT: jr $ra 20; MIPS32-NEXT: nop 21entry: 22 ret double %b 23} 24 25define float @float_in_gpr(i32 %a, float %b) { 26; MIPS32-LABEL: float_in_gpr: 27; MIPS32: # %bb.0: # %entry 28; MIPS32-NEXT: mtc1 $5, $f0 29; MIPS32-NEXT: jr $ra 30; MIPS32-NEXT: nop 31entry: 32 ret float %b 33} 34 35define double @double_in_gpr(i32 %a, double %b) { 36; FP32-LABEL: double_in_gpr: 37; FP32: # %bb.0: # %entry 38; FP32-NEXT: mtc1 $6, $f0 39; FP32-NEXT: mtc1 $7, $f1 40; FP32-NEXT: jr $ra 41; FP32-NEXT: nop 42; 43; FP64-LABEL: double_in_gpr: 44; FP64: # %bb.0: # %entry 45; FP64-NEXT: mtc1 $6, $f0 46; FP64-NEXT: mthc1 $7, $f0 47; FP64-NEXT: jr $ra 48; FP64-NEXT: nop 49entry: 50 ret double %b 51} 52 53define float @call_float_in_fpr(float %a, float %b) { 54; MIPS32-LABEL: call_float_in_fpr: 55; MIPS32: # %bb.0: # %entry 56; MIPS32-NEXT: addiu $sp, $sp, -24 57; MIPS32-NEXT: .cfi_def_cfa_offset 24 58; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 59; MIPS32-NEXT: .cfi_offset 31, -4 60; MIPS32-NEXT: jal float_in_fpr 61; MIPS32-NEXT: nop 62; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 63; MIPS32-NEXT: addiu $sp, $sp, 24 64; MIPS32-NEXT: jr $ra 65; MIPS32-NEXT: nop 66entry: 67 %call = call float @float_in_fpr(float %a, float %b) 68 ret float %call 69} 70 71define double @call_double_in_fpr(double %a, double %b) { 72; MIPS32-LABEL: call_double_in_fpr: 73; MIPS32: # %bb.0: # %entry 74; MIPS32-NEXT: addiu $sp, $sp, -24 75; MIPS32-NEXT: .cfi_def_cfa_offset 24 76; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 77; MIPS32-NEXT: .cfi_offset 31, -4 78; MIPS32-NEXT: jal double_in_fpr 79; MIPS32-NEXT: nop 80; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 81; MIPS32-NEXT: addiu $sp, $sp, 24 82; MIPS32-NEXT: jr $ra 83; MIPS32-NEXT: nop 84entry: 85 %call = call double @double_in_fpr(double %a, double %b) 86 ret double %call 87} 88 89define float @call_float_in_gpr(i32 %a, float %b) { 90; MIPS32-LABEL: call_float_in_gpr: 91; MIPS32: # %bb.0: # %entry 92; MIPS32-NEXT: addiu $sp, $sp, -24 93; MIPS32-NEXT: .cfi_def_cfa_offset 24 94; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 95; MIPS32-NEXT: .cfi_offset 31, -4 96; MIPS32-NEXT: mtc1 $5, $f0 97; MIPS32-NEXT: mfc1 $5, $f0 98; MIPS32-NEXT: jal float_in_gpr 99; MIPS32-NEXT: nop 100; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 101; MIPS32-NEXT: addiu $sp, $sp, 24 102; MIPS32-NEXT: jr $ra 103; MIPS32-NEXT: nop 104entry: 105 %call = call float @float_in_gpr(i32 %a, float %b) 106 ret float %call 107} 108 109 110define double @call_double_in_gpr(i32 %a, double %b) { 111; FP32-LABEL: call_double_in_gpr: 112; FP32: # %bb.0: # %entry 113; FP32-NEXT: addiu $sp, $sp, -24 114; FP32-NEXT: .cfi_def_cfa_offset 24 115; FP32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 116; FP32-NEXT: .cfi_offset 31, -4 117; FP32-NEXT: mtc1 $6, $f0 118; FP32-NEXT: mtc1 $7, $f1 119; FP32-NEXT: mfc1 $7, $f1 120; FP32-NEXT: mfc1 $6, $f0 121; FP32-NEXT: jal double_in_gpr 122; FP32-NEXT: nop 123; FP32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 124; FP32-NEXT: addiu $sp, $sp, 24 125; FP32-NEXT: jr $ra 126; FP32-NEXT: nop 127; 128; FP64-LABEL: call_double_in_gpr: 129; FP64: # %bb.0: # %entry 130; FP64-NEXT: addiu $sp, $sp, -24 131; FP64-NEXT: .cfi_def_cfa_offset 24 132; FP64-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill 133; FP64-NEXT: .cfi_offset 31, -4 134; FP64-NEXT: mtc1 $6, $f0 135; FP64-NEXT: mthc1 $7, $f0 136; FP64-NEXT: mfhc1 $7, $f0 137; FP64-NEXT: mfc1 $6, $f0 138; FP64-NEXT: jal double_in_gpr 139; FP64-NEXT: nop 140; FP64-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload 141; FP64-NEXT: addiu $sp, $sp, 24 142; FP64-NEXT: jr $ra 143; FP64-NEXT: nop 144entry: 145 %call = call double @double_in_gpr(i32 %a, double %b) 146 ret double %call 147} 148