Index: test/NaCl/Bitcode/pnacl-bcdis/fcmp.ll |
diff --git a/test/NaCl/Bitcode/pnacl-bcdis/fcmp.ll b/test/NaCl/Bitcode/pnacl-bcdis/fcmp.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5115f1e4368286d01d29e022ab18e98afae49a25 |
--- /dev/null |
+++ b/test/NaCl/Bitcode/pnacl-bcdis/fcmp.ll |
@@ -0,0 +1,226 @@ |
+; Tests the fcmp instruction. |
+ |
+; RUN: llvm-as < %s | pnacl-freeze | pnacl-bccompress --remove-abbreviations \ |
+; RUN: | pnacl-bcdis | FileCheck %s |
+ |
+ |
+; Test fcmp on primitive types. |
+define void @SimpleFcmpOps(float %p0, double %p1) { |
+ |
+; CHECK: | | %b0: |
+ |
+ %v0 = fcmp false float %p0, 2.0 |
+ %v1 = fcmp false double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 4, 2, 0> | %v0 = fcmp false float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 4, 2, 0> | %v1 = fcmp false double %p1, %c1; |
+ |
+ %v2 = fcmp oeq float %p0, 2.0 |
+ %v3 = fcmp oeq double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 6, 4, 1> | %v2 = fcmp oeq float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 6, 4, 1> | %v3 = fcmp oeq double %p1, %c1; |
+ |
+ %v4 = fcmp ogt float %p0, 2.0 |
+ %v5 = fcmp ogt double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 8, 6, 2> | %v4 = fcmp ogt float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 8, 6, 2> | %v5 = fcmp ogt double %p1, %c1; |
+ |
+ %v6 = fcmp oge float %p0, 2.0 |
+ %v7 = fcmp oge double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 10, 8, 3> | %v6 = fcmp oge float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 10, 8, 3> | %v7 = fcmp oge double %p1, %c1; |
+ |
+ %v8 = fcmp olt float %p0, 2.0 |
+ %v9 = fcmp olt double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 12, 10, 4> | %v8 = fcmp olt float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 12, 10, 4> | %v9 = fcmp olt double %p1, %c1; |
+ |
+ %v10 = fcmp ole float %p0, 2.0 |
+ %v11 = fcmp ole double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 14, 12, 5> | %v10 = fcmp ole float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 14, 12, 5> | %v11 = fcmp ole double %p1, %c1; |
+ |
+ %v12 = fcmp one float %p0, 2.0 |
+ %v13 = fcmp one double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 16, 14, 6> | %v12 = fcmp one float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 16, 14, 6> | %v13 = fcmp one double %p1, %c1; |
+ |
+ %v14 = fcmp ord float %p0, 2.0 |
+ %v15 = fcmp ord double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 18, 16, 7> | %v14 = fcmp ord float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 18, 16, 7> | %v15 = fcmp ord double %p1, %c1; |
+ |
+ %v16 = fcmp ueq float %p0, 2.0 |
+ %v17 = fcmp ueq double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 20, 18, 9> | %v16 = fcmp ueq float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 20, 18, 9> | %v17 = fcmp ueq double %p1, %c1; |
+ |
+ %v18 = fcmp ugt float %p0, 2.0 |
+ %v19 = fcmp ugt double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 22, 20, 10> | %v18 = fcmp ugt float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 22, 20, 10> | %v19 = fcmp ugt double %p1, %c1; |
+ |
+ %v20 = fcmp uge float %p0, 2.0 |
+ %v21 = fcmp uge double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 24, 22, 11> | %v20 = fcmp uge float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 24, 22, 11> | %v21 = fcmp uge double %p1, %c1; |
+ |
+ %v22 = fcmp ult float %p0, 2.0 |
+ %v23 = fcmp ult double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 26, 24, 12> | %v22 = fcmp ult float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 26, 24, 12> | %v23 = fcmp ult double %p1, %c1; |
+ |
+ %v24 = fcmp ule float %p0, 2.0 |
+ %v25 = fcmp ule double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 28, 26, 13> | %v24 = fcmp ule float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 28, 26, 13> | %v25 = fcmp ule double %p1, %c1; |
+ |
+ %v26 = fcmp une float %p0, 2.0 |
+ %v27 = fcmp une double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 30, 28, 14> | %v26 = fcmp une float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 30, 28, 14> | %v27 = fcmp une double %p1, %c1; |
+ |
+ %v28 = fcmp uno float %p0, 2.0 |
+ %v29 = fcmp uno double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 32, 30, 8> | %v28 = fcmp uno float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 32, 30, 8> | %v29 = fcmp uno double %p1, %c1; |
+ |
+ %v30 = fcmp true float %p0, 2.0 |
+ %v31 = fcmp true double %p1, 3.0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 34, 32, 15> | %v30 = fcmp true float %p0, %c0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 34, 32, 15> | %v31 = fcmp true double %p1, %c1; |
+ |
+ ; Verifies result is i1. |
+ %v32 = and i1 %v0, %v16 |
+ %v33 = and i1 %v1, %v17 |
+ %v34 = and i1 %v2, %v18 |
+ %v35 = and i1 %v3, %v19 |
+ %v36 = and i1 %v4, %v20 |
+ %v37 = and i1 %v5, %v21 |
+ %v38 = and i1 %v6, %v22 |
+ %v39 = and i1 %v7, %v23 |
+ %v40 = and i1 %v8, %v24 |
+ %v41 = and i1 %v9, %v25 |
+ %v42 = and i1 %v10, %v26 |
+ %v43 = and i1 %v11, %v27 |
+ %v44 = and i1 %v12, %v28 |
+ %v45 = and i1 %v13, %v29 |
+ %v46 = and i1 %v14, %v30 |
+ %v47 = and i1 %v15, %v31 |
+ ret void |
+ |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v32 = and i1 %v0, %v16; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v33 = and i1 %v1, %v17; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v34 = and i1 %v2, %v18; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v35 = and i1 %v3, %v19; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v36 = and i1 %v4, %v20; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v37 = and i1 %v5, %v21; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v38 = and i1 %v6, %v22; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v39 = and i1 %v7, %v23; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v40 = and i1 %v8, %v24; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v41 = and i1 %v9, %v25; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v42 = and i1 %v10, %v26; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v43 = and i1 %v11, %v27; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v44 = and i1 %v12, %v28; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v45 = and i1 %v13, %v29; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v46 = and i1 %v14, %v30; |
+; CHECK-NEXT: {{.*}}| 3: <2, 32, 16, 10> | %v47 = and i1 %v15, %v31; |
+; CHECK-NEXT: {{.*}}| 3: <10> | ret void; |
+ |
+} |
+ |
+ |
+ |
+; Tests floating vector compares |
+define internal void @VecFloatOps(<4 x float> %p0) { |
+ |
+; CHECK: | | %b0: |
+ |
+ %v0 = fcmp false <4 x float> %p0, %p0 |
+ %v1 = fcmp oeq <4 x float> %p0, %p0 |
+ %v2 = fcmp ogt <4 x float> %p0, %p0 |
+ %v3 = fcmp oge <4 x float> %p0, %p0 |
+ %v4 = fcmp olt <4 x float> %p0, %p0 |
+ %v5 = fcmp ole <4 x float> %p0, %p0 |
+ %v6 = fcmp one <4 x float> %p0, %p0 |
+ %v7 = fcmp ord <4 x float> %p0, %p0 |
+ %v8 = fcmp ueq <4 x float> %p0, %p0 |
+ %v9 = fcmp ugt <4 x float> %p0, %p0 |
+ %v10 = fcmp uge <4 x float> %p0, %p0 |
+ %v11 = fcmp ult <4 x float> %p0, %p0 |
+ %v12 = fcmp ule <4 x float> %p0, %p0 |
+ %v13 = fcmp une <4 x float> %p0, %p0 |
+ %v14 = fcmp uno <4 x float> %p0, %p0 |
+ %v15 = fcmp true <4 x float> %p0, %p0 |
+ |
+; CHECK-NEXT: {{.*}}| 3: <28, 1, 1, 0> | %v0 = fcmp false <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 2, 2, 1> | %v1 = fcmp oeq <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 3, 3, 2> | %v2 = fcmp ogt <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 4, 4, 3> | %v3 = fcmp oge <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 5, 5, 4> | %v4 = fcmp olt <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 6, 6, 5> | %v5 = fcmp ole <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 7, 7, 6> | %v6 = fcmp one <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 8, 8, 7> | %v7 = fcmp ord <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 9, 9, 9> | %v8 = fcmp ueq <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 10, 10, 10> | %v9 = fcmp ugt <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 11, 11, 11> | %v10 = fcmp uge <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 12, 12, 12> | %v11 = fcmp ult <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 13, 13, 13> | %v12 = fcmp ule <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 14, 14, 14> | %v13 = fcmp une <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 15, 15, 8> | %v14 = fcmp uno <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+; CHECK-NEXT: {{.*}}| 3: <28, 16, 16, 15> | %v15 = fcmp true <4 x float> %p0, |
+; CHECK-NEXT: | | %p0; |
+ |
+ ; Verify the result is a vector of the right size. |
+ %v16 = and <4 x i1> %v0, %v1 |
+ %v17 = and <4 x i1> %v2, %v3 |
+ %v18 = and <4 x i1> %v4, %v5 |
+ %v19 = and <4 x i1> %v6, %v7 |
+ %v20 = and <4 x i1> %v8, %v9 |
+ %v21 = and <4 x i1> %v10, %v11 |
+ %v22 = and <4 x i1> %v12, %v13 |
+ %v23 = and <4 x i1> %v14, %v15 |
+ ret void |
+ |
+; CHECK-NEXT: {{.*}}| 3: <2, 16, 15, 10> | %v16 = and <4 x i1> %v0, %v1; |
+; CHECK-NEXT: {{.*}}| 3: <2, 15, 14, 10> | %v17 = and <4 x i1> %v2, %v3; |
+; CHECK-NEXT: {{.*}}| 3: <2, 14, 13, 10> | %v18 = and <4 x i1> %v4, %v5; |
+; CHECK-NEXT: {{.*}}| 3: <2, 13, 12, 10> | %v19 = and <4 x i1> %v6, %v7; |
+; CHECK-NEXT: {{.*}}| 3: <2, 12, 11, 10> | %v20 = and <4 x i1> %v8, %v9; |
+; CHECK-NEXT: {{.*}}| 3: <2, 11, 10, 10> | %v21 = and <4 x i1> %v10, %v11; |
+; CHECK-NEXT: {{.*}}| 3: <2, 10, 9, 10> | %v22 = and <4 x i1> %v12, %v13; |
+; CHECK-NEXT: {{.*}}| 3: <2, 9, 8, 10> | %v23 = and <4 x i1> %v14, %v15; |
+; CHECK-NEXT: {{.*}}| 3: <10> | ret void; |
+ |
+} |
+ |