Index: crosstest/test_fcmp.pnacl.ll |
diff --git a/crosstest/test_fcmp.pnacl.ll b/crosstest/test_fcmp.pnacl.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7c4d42e5a15f99bd80ca642b428907088704c4cc |
--- /dev/null |
+++ b/crosstest/test_fcmp.pnacl.ll |
@@ -0,0 +1,324 @@ |
+target triple = "i686-pc-linux-gnu" |
+ |
+; This file is extracted from fp.pnacl.ll in the lit tests, with |
+; the "internal" attribute removed from the functions. |
+ |
+define i32 @fcmpFalseFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp false float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpFalseFloat: |
+; CHECK: mov {{.*}}, 0 |
+ |
+define i32 @fcmpFalseDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp false double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpFalseDouble: |
+; CHECK: mov {{.*}}, 0 |
+ |
+define i32 @fcmpOeqFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp oeq float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOeqFloat: |
+; CHECK: ucomiss |
+; CHECK: jne . |
+; CHECK: jp . |
+ |
+define i32 @fcmpOeqDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp oeq double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOeqDouble: |
+; CHECK: ucomisd |
+; CHECK: jne . |
+; CHECK: jp . |
+ |
+define i32 @fcmpOgtFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp ogt float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOgtFloat: |
+; CHECK: ucomiss |
+; CHECK: ja . |
+ |
+define i32 @fcmpOgtDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp ogt double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOgtDouble: |
+; CHECK: ucomisd |
+; CHECK: ja . |
+ |
+define i32 @fcmpOgeFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp oge float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOgeFloat: |
+; CHECK: ucomiss |
+; CHECK: jae . |
+ |
+define i32 @fcmpOgeDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp oge double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOgeDouble: |
+; CHECK: ucomisd |
+; CHECK: jae . |
+ |
+define i32 @fcmpOltFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp olt float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOltFloat: |
+; CHECK: ucomiss |
+; CHECK: ja . |
+ |
+define i32 @fcmpOltDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp olt double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOltDouble: |
+; CHECK: ucomisd |
+; CHECK: ja . |
+ |
+define i32 @fcmpOleFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp ole float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOleFloat: |
+; CHECK: ucomiss |
+; CHECK: jae . |
+ |
+define i32 @fcmpOleDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp ole double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOleDouble: |
+; CHECK: ucomisd |
+; CHECK: jae . |
+ |
+define i32 @fcmpOneFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp one float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOneFloat: |
+; CHECK: ucomiss |
+; CHECK: jne . |
+ |
+define i32 @fcmpOneDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp one double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOneDouble: |
+; CHECK: ucomisd |
+; CHECK: jne . |
+ |
+define i32 @fcmpOrdFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp ord float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOrdFloat: |
+; CHECK: ucomiss |
+; CHECK: jnp . |
+ |
+define i32 @fcmpOrdDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp ord double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpOrdDouble: |
+; CHECK: ucomisd |
+; CHECK: jnp . |
+ |
+define i32 @fcmpUeqFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp ueq float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUeqFloat: |
+; CHECK: ucomiss |
+; CHECK: je . |
+ |
+define i32 @fcmpUeqDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp ueq double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUeqDouble: |
+; CHECK: ucomisd |
+; CHECK: je . |
+ |
+define i32 @fcmpUgtFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp ugt float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUgtFloat: |
+; CHECK: ucomiss |
+; CHECK: jb . |
+ |
+define i32 @fcmpUgtDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp ugt double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUgtDouble: |
+; CHECK: ucomisd |
+; CHECK: jb . |
+ |
+define i32 @fcmpUgeFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp uge float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUgeFloat: |
+; CHECK: ucomiss |
+; CHECK: jbe . |
+ |
+define i32 @fcmpUgeDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp uge double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUgeDouble: |
+; CHECK: ucomisd |
+; CHECK: jbe . |
+ |
+define i32 @fcmpUltFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp ult float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUltFloat: |
+; CHECK: ucomiss |
+; CHECK: jb . |
+ |
+define i32 @fcmpUltDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp ult double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUltDouble: |
+; CHECK: ucomisd |
+; CHECK: jb . |
+ |
+define i32 @fcmpUleFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp ule float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUleFloat: |
+; CHECK: ucomiss |
+; CHECK: jbe . |
+ |
+define i32 @fcmpUleDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp ule double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUleDouble: |
+; CHECK: ucomisd |
+; CHECK: jbe . |
+ |
+define i32 @fcmpUneFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp une float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUneFloat: |
+; CHECK: ucomiss |
+; CHECK: je . |
+; CHECK: jnp . |
+ |
+define i32 @fcmpUneDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp une double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUneDouble: |
+; CHECK: ucomisd |
+; CHECK: je . |
+; CHECK: jnp . |
+ |
+define i32 @fcmpUnoFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp uno float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUnoFloat: |
+; CHECK: ucomiss |
+; CHECK: jp . |
+ |
+define i32 @fcmpUnoDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp uno double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpUnoDouble: |
+; CHECK: ucomisd |
+; CHECK: jp . |
+ |
+define i32 @fcmpTrueFloat(float %a, float %b) { |
+entry: |
+ %cmp = fcmp true float %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpTrueFloat: |
+; CHECK: mov {{.*}}, 1 |
+ |
+define i32 @fcmpTrueDouble(double %a, double %b) { |
+entry: |
+ %cmp = fcmp true double %a, %b |
+ %cmp.ret_ext = zext i1 %cmp to i32 |
+ ret i32 %cmp.ret_ext |
+} |
+; CHECK: fcmpTrueDouble: |
+; CHECK: mov {{.*}}, 1 |