Index: tests_lit/llvm2ice_tests/fp.arith.ll |
diff --git a/tests_lit/llvm2ice_tests/fp.arith.ll b/tests_lit/llvm2ice_tests/fp.arith.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c57045aa69945e07be12dbed10f5d5fa050664db |
--- /dev/null |
+++ b/tests_lit/llvm2ice_tests/fp.arith.ll |
@@ -0,0 +1,130 @@ |
+; 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 --need=allow_dump \ |
+; RUN: --command %p2i --filetype=asm --assemble --disassemble --target arm32 \ |
+; RUN: -i %s --args -O2 --skip-unimplemented \ |
+; RUN: | %if --need=target_ARM32 --need=allow_dump \ |
+; RUN: --command FileCheck --check-prefix ARM32 %s |
+; RUN: %if --need=target_ARM32 --need=allow_dump \ |
+; RUN: --command %p2i --filetype=asm --assemble --disassemble --target arm32 \ |
+; RUN: -i %s --args -Om1 --skip-unimplemented \ |
+; RUN: | %if --need=target_ARM32 --need=allow_dump \ |
+; RUN: --command FileCheck --check-prefix ARM32 %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 |
+ |
+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 |
+ |
+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 |
+ |
+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 |
+ |
+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 |
+ |
+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 |
+ |
+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 |
+ |
+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 |
+ |
+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 |
+ |
+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 |