| ; This tries to be a comprehensive test of f32 and f64 arith operations. | |
| ; The CHECK lines are only checking for basic instruction patterns | |
| ; that should be present regardless of the optimization level, so | |
| ; there are no special OPTM1 match lines. | |
| ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | |
| ; RUN: --target x8632 -i %s --args -O2 \ | |
| ; RUN: | %if --need=target_X8632 --command FileCheck %s | |
| ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \ | |
| ; RUN: --target x8632 -i %s --args -Om1 \ | |
| ; RUN: | %if --need=target_X8632 --command FileCheck %s | |
| ; RUN: %if --need=target_ARM32 \ | |
| ; RUN: --command %p2i --filetype=obj --disassemble --target arm32 \ | |
| ; RUN: -i %s --args -O2 \ | |
| ; RUN: | %if --need=target_ARM32 \ | |
| ; RUN: --command FileCheck --check-prefix ARM32 %s | |
| ; RUN: %if --need=target_ARM32 \ | |
| ; RUN: --command %p2i --filetype=obj --disassemble --target arm32 \ | |
| ; RUN: -i %s --args -Om1 \ | |
| ; RUN: | %if --need=target_ARM32 \ | |
| ; RUN: --command FileCheck --check-prefix ARM32 %s | |
| ; RUN: %if --need=target_MIPS32 --need=allow_dump \ | |
| ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target \ | |
| ; RUN: mips32 -i %s --args -O2 \ | |
| ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ | |
| ; RUN: --command FileCheck --check-prefix MIPS32 %s | |
| ; RUN: %if --need=target_MIPS32 --need=allow_dump \ | |
| ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target \ | |
| ; RUN: mips32 -i %s --args -Om1 \ | |
| ; RUN: | %if --need=target_MIPS32 --need=allow_dump \ | |
| ; RUN: --command FileCheck --check-prefix MIPS32 %s | |
| define internal float @addFloat(float %a, float %b) { | |
| entry: | |
| %add = fadd float %a, %b | |
| ret float %add | |
| } | |
| ; CHECK-LABEL: addFloat | |
| ; CHECK: addss | |
| ; CHECK: fld | |
| ; ARM32-LABEL: addFloat | |
| ; ARM32: vadd.f32 s{{[0-9]+}}, s | |
| ; MIPS32-LABEL: addFloat | |
| ; MIPS32: add.s | |
| define internal double @addDouble(double %a, double %b) { | |
| entry: | |
| %add = fadd double %a, %b | |
| ret double %add | |
| } | |
| ; CHECK-LABEL: addDouble | |
| ; CHECK: addsd | |
| ; CHECK: fld | |
| ; ARM32-LABEL: addDouble | |
| ; ARM32: vadd.f64 d{{[0-9]+}}, d | |
| ; MIPS32-LABEL: addDouble | |
| ; MIPS32: add.d | |
| define internal float @subFloat(float %a, float %b) { | |
| entry: | |
| %sub = fsub float %a, %b | |
| ret float %sub | |
| } | |
| ; CHECK-LABEL: subFloat | |
| ; CHECK: subss | |
| ; CHECK: fld | |
| ; ARM32-LABEL: subFloat | |
| ; ARM32: vsub.f32 s{{[0-9]+}}, s | |
| ; MIPS32-LABEL: subFloat | |
| ; MIPS32: sub.s | |
| define internal double @subDouble(double %a, double %b) { | |
| entry: | |
| %sub = fsub double %a, %b | |
| ret double %sub | |
| } | |
| ; CHECK-LABEL: subDouble | |
| ; CHECK: subsd | |
| ; CHECK: fld | |
| ; ARM32-LABEL: subDouble | |
| ; ARM32: vsub.f64 d{{[0-9]+}}, d | |
| ; MIPS32-LABEL: subDouble | |
| ; MIPS32: sub.d | |
| define internal float @mulFloat(float %a, float %b) { | |
| entry: | |
| %mul = fmul float %a, %b | |
| ret float %mul | |
| } | |
| ; CHECK-LABEL: mulFloat | |
| ; CHECK: mulss | |
| ; CHECK: fld | |
| ; ARM32-LABEL: mulFloat | |
| ; ARM32: vmul.f32 s{{[0-9]+}}, s | |
| ; MIPS32-LABEL: mulFloat | |
| ; MIPS32: mul.s | |
| define internal double @mulDouble(double %a, double %b) { | |
| entry: | |
| %mul = fmul double %a, %b | |
| ret double %mul | |
| } | |
| ; CHECK-LABEL: mulDouble | |
| ; CHECK: mulsd | |
| ; CHECK: fld | |
| ; ARM32-LABEL: mulDouble | |
| ; ARM32: vmul.f64 d{{[0-9]+}}, d | |
| ; MIPS32-LABEL: mulDouble | |
| ; MIPS32: mul.d | |
| define internal float @divFloat(float %a, float %b) { | |
| entry: | |
| %div = fdiv float %a, %b | |
| ret float %div | |
| } | |
| ; CHECK-LABEL: divFloat | |
| ; CHECK: divss | |
| ; CHECK: fld | |
| ; ARM32-LABEL: divFloat | |
| ; ARM32: vdiv.f32 s{{[0-9]+}}, s | |
| ; MIPS32-LABEL: divFloat | |
| ; MIPS32: div.s | |
| define internal double @divDouble(double %a, double %b) { | |
| entry: | |
| %div = fdiv double %a, %b | |
| ret double %div | |
| } | |
| ; CHECK-LABEL: divDouble | |
| ; CHECK: divsd | |
| ; CHECK: fld | |
| ; ARM32-LABEL: divDouble | |
| ; ARM32: vdiv.f64 d{{[0-9]+}}, d | |
| ; MIPS32-LABEL: divDouble | |
| ; MIPS32: div.d | |
| define internal float @remFloat(float %a, float %b) { | |
| entry: | |
| %div = frem float %a, %b | |
| ret float %div | |
| } | |
| ; CHECK-LABEL: remFloat | |
| ; CHECK: call {{.*}} R_{{.*}} fmodf | |
| ; ARM32-LABEL: remFloat | |
| ; ARM32: bl {{.*}} fmodf | |
| ; MIPS32-LABEL: remFloat | |
| ; MIPS32: jal {{.*}} fmodf | |
| define internal double @remDouble(double %a, double %b) { | |
| entry: | |
| %div = frem double %a, %b | |
| ret double %div | |
| } | |
| ; CHECK-LABEL: remDouble | |
| ; CHECK: call {{.*}} R_{{.*}} fmod | |
| ; ARM32-LABEL: remDouble | |
| ; ARM32: bl {{.*}} fmod | |
| ; MIPS32-LABEL: remDouble | |
| ; MIPS32: jal {{.*}} fmod |