1 ; This tries to be a comprehensive test of f32 and f64 arith operations. 2 ; The CHECK lines are only checking for basic instruction patterns 3 ; that should be present regardless of the optimization level, so 4 ; there are no special OPTM1 match lines. 5 6 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ 7 ; RUN: --target x8632 -i %s --args -O2 \ 8 ; RUN: | %if --need=target_X8632 --command FileCheck %s 9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ 10 ; RUN: --target x8632 -i %s --args -Om1 \ 11 ; RUN: | %if --need=target_X8632 --command FileCheck %s 12 13 ; RUN: %if --need=target_ARM32 \ 14 ; RUN: --command %p2i --filetype=obj --disassemble --target arm32 \ 15 ; RUN: -i %s --args -O2 \ 16 ; RUN: | %if --need=target_ARM32 \ 17 ; RUN: --command FileCheck --check-prefix ARM32 %s 18 ; RUN: %if --need=target_ARM32 \ 19 ; RUN: --command %p2i --filetype=obj --disassemble --target arm32 \ 20 ; RUN: -i %s --args -Om1 \ 21 ; RUN: | %if --need=target_ARM32 \ 22 ; RUN: --command FileCheck --check-prefix ARM32 %s 23 24 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ 25 ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target \ 26 ; RUN: mips32 -i %s --args -O2 \ 27 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ 28 ; RUN: --command FileCheck --check-prefix MIPS32 %s 29 ; RUN: %if --need=target_MIPS32 --need=allow_dump \ 30 ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target \ 31 ; RUN: mips32 -i %s --args -Om1 \ 32 ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ 33 ; RUN: --command FileCheck --check-prefix MIPS32 %s 34 35 define internal float @addFloat(float %a, float %b) { 36 entry: 37 %add = fadd float %a, %b 38 ret float %add 39 } 40 ; CHECK-LABEL: addFloat 41 ; CHECK: addss 42 ; CHECK: fld 43 ; ARM32-LABEL: addFloat 44 ; ARM32: vadd.f32 s{{[0-9]+}}, s 45 ; MIPS32-LABEL: addFloat 46 ; MIPS32: add.s 47 48 define internal double @addDouble(double %a, double %b) { 49 entry: 50 %add = fadd double %a, %b 51 ret double %add 52 } 53 ; CHECK-LABEL: addDouble 54 ; CHECK: addsd 55 ; CHECK: fld 56 ; ARM32-LABEL: addDouble 57 ; ARM32: vadd.f64 d{{[0-9]+}}, d 58 ; MIPS32-LABEL: addDouble 59 ; MIPS32: add.d 60 61 define internal float @subFloat(float %a, float %b) { 62 entry: 63 %sub = fsub float %a, %b 64 ret float %sub 65 } 66 ; CHECK-LABEL: subFloat 67 ; CHECK: subss 68 ; CHECK: fld 69 ; ARM32-LABEL: subFloat 70 ; ARM32: vsub.f32 s{{[0-9]+}}, s 71 ; MIPS32-LABEL: subFloat 72 ; MIPS32: sub.s 73 74 define internal double @subDouble(double %a, double %b) { 75 entry: 76 %sub = fsub double %a, %b 77 ret double %sub 78 } 79 ; CHECK-LABEL: subDouble 80 ; CHECK: subsd 81 ; CHECK: fld 82 ; ARM32-LABEL: subDouble 83 ; ARM32: vsub.f64 d{{[0-9]+}}, d 84 ; MIPS32-LABEL: subDouble 85 ; MIPS32: sub.d 86 87 define internal float @mulFloat(float %a, float %b) { 88 entry: 89 %mul = fmul float %a, %b 90 ret float %mul 91 } 92 ; CHECK-LABEL: mulFloat 93 ; CHECK: mulss 94 ; CHECK: fld 95 ; ARM32-LABEL: mulFloat 96 ; ARM32: vmul.f32 s{{[0-9]+}}, s 97 ; MIPS32-LABEL: mulFloat 98 ; MIPS32: mul.s 99 100 define internal double @mulDouble(double %a, double %b) { 101 entry: 102 %mul = fmul double %a, %b 103 ret double %mul 104 } 105 ; CHECK-LABEL: mulDouble 106 ; CHECK: mulsd 107 ; CHECK: fld 108 ; ARM32-LABEL: mulDouble 109 ; ARM32: vmul.f64 d{{[0-9]+}}, d 110 ; MIPS32-LABEL: mulDouble 111 ; MIPS32: mul.d 112 113 define internal float @divFloat(float %a, float %b) { 114 entry: 115 %div = fdiv float %a, %b 116 ret float %div 117 } 118 ; CHECK-LABEL: divFloat 119 ; CHECK: divss 120 ; CHECK: fld 121 ; ARM32-LABEL: divFloat 122 ; ARM32: vdiv.f32 s{{[0-9]+}}, s 123 ; MIPS32-LABEL: divFloat 124 ; MIPS32: div.s 125 126 define internal double @divDouble(double %a, double %b) { 127 entry: 128 %div = fdiv double %a, %b 129 ret double %div 130 } 131 ; CHECK-LABEL: divDouble 132 ; CHECK: divsd 133 ; CHECK: fld 134 ; ARM32-LABEL: divDouble 135 ; ARM32: vdiv.f64 d{{[0-9]+}}, d 136 ; MIPS32-LABEL: divDouble 137 ; MIPS32: div.d 138 139 define internal float @remFloat(float %a, float %b) { 140 entry: 141 %div = frem float %a, %b 142 ret float %div 143 } 144 ; CHECK-LABEL: remFloat 145 ; CHECK: call {{.*}} R_{{.*}} fmodf 146 ; ARM32-LABEL: remFloat 147 ; ARM32: bl {{.*}} fmodf 148 ; MIPS32-LABEL: remFloat 149 ; MIPS32: jal {{.*}} fmodf 150 151 define internal double @remDouble(double %a, double %b) { 152 entry: 153 %div = frem double %a, %b 154 ret double %div 155 } 156 ; CHECK-LABEL: remDouble 157 ; CHECK: call {{.*}} R_{{.*}} fmod 158 ; ARM32-LABEL: remDouble 159 ; ARM32: bl {{.*}} fmod 160 ; MIPS32-LABEL: remDouble 161 ; MIPS32: jal {{.*}} fmod 162