OLD | NEW |
1 ; Tests various aspects of x86 opcode encodings. E.g., some opcodes like | 1 ; Tests various aspects of x86 opcode encodings. E.g., some opcodes like |
2 ; those for pmull vary more wildly depending on operand size (rather than | 2 ; those for pmull vary more wildly depending on operand size (rather than |
3 ; follow a usual pattern). | 3 ; follow a usual pattern). |
4 | 4 |
5 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 -mattr=sse4.1 \ | 5 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 -mattr=sse4.1 \ |
6 ; RUN: -sandbox | FileCheck %s | 6 ; RUN: -sandbox | FileCheck %s |
7 | 7 |
8 define <8 x i16> @test_mul_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) { | 8 define <8 x i16> @test_mul_v8i16(<8 x i16> %arg0, <8 x i16> %arg1) { |
9 entry: | 9 entry: |
10 %res = mul <8 x i16> %arg0, %arg1 | 10 %res = mul <8 x i16> %arg0, %arg1 |
11 ret <8 x i16> %res | 11 ret <8 x i16> %res |
12 ; CHECK-LABEL: test_mul_v8i16 | 12 ; CHECK-LABEL: test_mul_v8i16 |
13 ; CHECK: 66 0f d5 c1 pmullw xmm0,xmm1 | 13 ; CHECK: 66 0f d5 c1 pmullw xmm0,xmm1 |
14 } | 14 } |
15 | 15 |
16 ; Test register and address mode encoding. | 16 ; Test register and address mode encoding. |
17 define <8 x i16> @test_mul_v8i16_more_regs(<8 x i1> %cond, <8 x i16> %arg0, <8 x
i16> %arg1, <8 x i16> %arg2, <8 x i16> %arg3, <8 x i16> %arg4, <8 x i16> %arg5,
<8 x i16> %arg6, <8 x i16> %arg7, <8 x i16> %arg8) { | 17 define <8 x i16> @test_mul_v8i16_more_regs(<8 x i1> %cond, <8 x i16> %arg0, <8 x
i16> %arg1, <8 x i16> %arg2, <8 x i16> %arg3, <8 x i16> %arg4, <8 x i16> %arg5,
<8 x i16> %arg6, <8 x i16> %arg7, <8 x i16> %arg8) { |
18 entry: | 18 entry: |
19 %res1 = mul <8 x i16> %arg0, %arg1 | 19 %res1 = sub <8 x i16> %arg0, %arg1 |
20 %res2 = mul <8 x i16> %arg0, %arg2 | 20 %res2 = sub <8 x i16> %arg0, %arg2 |
21 %res3 = mul <8 x i16> %arg0, %arg3 | 21 %res3 = sub <8 x i16> %arg0, %arg3 |
22 %res4 = mul <8 x i16> %arg0, %arg4 | 22 %res4 = sub <8 x i16> %arg0, %arg4 |
23 %res5 = mul <8 x i16> %arg0, %arg5 | 23 %res5 = sub <8 x i16> %arg0, %arg5 |
24 %res6 = mul <8 x i16> %arg0, %arg6 | 24 %res6 = sub <8 x i16> %arg0, %arg6 |
25 %res7 = mul <8 x i16> %arg0, %arg7 | 25 %res7 = sub <8 x i16> %arg0, %arg7 |
26 %res8 = mul <8 x i16> %arg0, %arg8 | 26 %res8 = sub <8 x i16> %arg0, %arg8 |
27 %res_acc1 = select <8 x i1> %cond, <8 x i16> %res1, <8 x i16> %res2 | 27 %res_acc1 = select <8 x i1> %cond, <8 x i16> %res1, <8 x i16> %res2 |
28 %res_acc2 = select <8 x i1> %cond, <8 x i16> %res3, <8 x i16> %res4 | 28 %res_acc2 = select <8 x i1> %cond, <8 x i16> %res3, <8 x i16> %res4 |
29 %res_acc3 = select <8 x i1> %cond, <8 x i16> %res5, <8 x i16> %res6 | 29 %res_acc3 = select <8 x i1> %cond, <8 x i16> %res5, <8 x i16> %res6 |
30 %res_acc4 = select <8 x i1> %cond, <8 x i16> %res7, <8 x i16> %res8 | 30 %res_acc4 = select <8 x i1> %cond, <8 x i16> %res7, <8 x i16> %res8 |
31 %res_acc1_3 = select <8 x i1> %cond, <8 x i16> %res_acc1, <8 x i16> %res_acc3 | 31 %res_acc1_3 = select <8 x i1> %cond, <8 x i16> %res_acc1, <8 x i16> %res_acc3 |
32 %res_acc2_4 = select <8 x i1> %cond, <8 x i16> %res_acc2, <8 x i16> %res_acc4 | 32 %res_acc2_4 = select <8 x i1> %cond, <8 x i16> %res_acc2, <8 x i16> %res_acc4 |
33 %res = select <8 x i1> %cond, <8 x i16> %res_acc1_3, <8 x i16> %res_acc2_4 | 33 %res = select <8 x i1> %cond, <8 x i16> %res_acc1_3, <8 x i16> %res_acc2_4 |
34 ret <8 x i16> %res | 34 ret <8 x i16> %res |
35 ; CHECK-LABEL: test_mul_v8i16_more_regs | 35 ; CHECK-LABEL: test_mul_v8i16_more_regs |
36 ; CHECK-DAG: pmullw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 36 ; CHECK-DAG: psubw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
37 ; CHECK-DAG: pmullw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 37 ; CHECK-DAG: psubw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
38 ; CHECK-DAG: pmullw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 38 ; CHECK-DAG: psubw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
39 ; CHECK-DAG: pmullw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 39 ; CHECK-DAG: psubw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
40 ; CHECK-DAG: pmullw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 40 ; CHECK-DAG: psubw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
41 ; CHECK-DAG: pmullw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 41 ; CHECK-DAG: psubw xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
42 ; CHECK-DAG: pmullw xmm0,XMMWORD PTR [esp | 42 ; CHECK-DAG: psubw xmm0,XMMWORD PTR [esp |
43 ; CHECK-DAG: pmullw xmm1,XMMWORD PTR [esp | 43 ; CHECK-DAG: psubw xmm1,XMMWORD PTR [esp |
44 } | 44 } |
45 | 45 |
46 define <4 x i32> @test_mul_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) { | 46 define <4 x i32> @test_mul_v4i32(<4 x i32> %arg0, <4 x i32> %arg1) { |
47 entry: | 47 entry: |
48 %res = mul <4 x i32> %arg0, %arg1 | 48 %res = mul <4 x i32> %arg0, %arg1 |
49 ret <4 x i32> %res | 49 ret <4 x i32> %res |
50 ; CHECK-LABEL: test_mul_v4i32 | 50 ; CHECK-LABEL: test_mul_v4i32 |
51 ; CHECK: 66 0f 38 40 c1 pmulld xmm0,xmm1 | 51 ; CHECK: 66 0f 38 40 c1 pmulld xmm0,xmm1 |
52 } | 52 } |
53 | 53 |
54 define <4 x i32> @test_mul_v4i32_more_regs(<4 x i1> %cond, <4 x i32> %arg0, <4 x
i32> %arg1, <4 x i32> %arg2, <4 x i32> %arg3, <4 x i32> %arg4, <4 x i32> %arg5,
<4 x i32> %arg6, <4 x i32> %arg7, <4 x i32> %arg8) { | 54 define <4 x i32> @test_mul_v4i32_more_regs(<4 x i1> %cond, <4 x i32> %arg0, <4 x
i32> %arg1, <4 x i32> %arg2, <4 x i32> %arg3, <4 x i32> %arg4, <4 x i32> %arg5,
<4 x i32> %arg6, <4 x i32> %arg7, <4 x i32> %arg8) { |
55 entry: | 55 entry: |
56 %res1 = mul <4 x i32> %arg0, %arg1 | 56 %res1 = sub <4 x i32> %arg0, %arg1 |
57 %res2 = mul <4 x i32> %arg0, %arg2 | 57 %res2 = sub <4 x i32> %arg0, %arg2 |
58 %res3 = mul <4 x i32> %arg0, %arg3 | 58 %res3 = sub <4 x i32> %arg0, %arg3 |
59 %res4 = mul <4 x i32> %arg0, %arg4 | 59 %res4 = sub <4 x i32> %arg0, %arg4 |
60 %res5 = mul <4 x i32> %arg0, %arg5 | 60 %res5 = sub <4 x i32> %arg0, %arg5 |
61 %res6 = mul <4 x i32> %arg0, %arg6 | 61 %res6 = sub <4 x i32> %arg0, %arg6 |
62 %res7 = mul <4 x i32> %arg0, %arg7 | 62 %res7 = sub <4 x i32> %arg0, %arg7 |
63 %res8 = mul <4 x i32> %arg0, %arg8 | 63 %res8 = sub <4 x i32> %arg0, %arg8 |
64 %res_acc1 = select <4 x i1> %cond, <4 x i32> %res1, <4 x i32> %res2 | 64 %res_acc1 = select <4 x i1> %cond, <4 x i32> %res1, <4 x i32> %res2 |
65 %res_acc2 = select <4 x i1> %cond, <4 x i32> %res3, <4 x i32> %res4 | 65 %res_acc2 = select <4 x i1> %cond, <4 x i32> %res3, <4 x i32> %res4 |
66 %res_acc3 = select <4 x i1> %cond, <4 x i32> %res5, <4 x i32> %res6 | 66 %res_acc3 = select <4 x i1> %cond, <4 x i32> %res5, <4 x i32> %res6 |
67 %res_acc4 = select <4 x i1> %cond, <4 x i32> %res7, <4 x i32> %res8 | 67 %res_acc4 = select <4 x i1> %cond, <4 x i32> %res7, <4 x i32> %res8 |
68 %res_acc1_3 = select <4 x i1> %cond, <4 x i32> %res_acc1, <4 x i32> %res_acc3 | 68 %res_acc1_3 = select <4 x i1> %cond, <4 x i32> %res_acc1, <4 x i32> %res_acc3 |
69 %res_acc2_4 = select <4 x i1> %cond, <4 x i32> %res_acc2, <4 x i32> %res_acc4 | 69 %res_acc2_4 = select <4 x i1> %cond, <4 x i32> %res_acc2, <4 x i32> %res_acc4 |
70 %res = select <4 x i1> %cond, <4 x i32> %res_acc1_3, <4 x i32> %res_acc2_4 | 70 %res = select <4 x i1> %cond, <4 x i32> %res_acc1_3, <4 x i32> %res_acc2_4 |
71 ret <4 x i32> %res | 71 ret <4 x i32> %res |
72 ; CHECK-LABEL: test_mul_v4i32_more_regs | 72 ; CHECK-LABEL: test_mul_v4i32_more_regs |
73 ; CHECK-DAG: pmulld xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 73 ; CHECK-DAG: psubd xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
74 ; CHECK-DAG: pmulld xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 74 ; CHECK-DAG: psubd xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
75 ; CHECK-DAG: pmulld xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 75 ; CHECK-DAG: psubd xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
76 ; CHECK-DAG: pmulld xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 76 ; CHECK-DAG: psubd xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
77 ; CHECK-DAG: pmulld xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 77 ; CHECK-DAG: psubd xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
78 ; CHECK-DAG: pmulld xmm0,{{xmm[0-7]|xmmword ptr\[esp}} | 78 ; CHECK-DAG: psubd xmm0,{{xmm[0-7]|xmmword ptr\[esp}} |
79 ; CHECK-DAG: pmulld xmm0,XMMWORD PTR [esp | 79 ; CHECK-DAG: psubd xmm0,XMMWORD PTR [esp |
80 ; CHECK-DAG: pmulld xmm1,XMMWORD PTR [esp | 80 ; CHECK-DAG: psubd xmm1,XMMWORD PTR [esp |
81 } | 81 } |
82 | 82 |
83 ; Test movq, which is used by atomic stores. | 83 ; Test movq, which is used by atomic stores. |
84 declare void @llvm.nacl.atomic.store.i64(i64, i64*, i32) | 84 declare void @llvm.nacl.atomic.store.i64(i64, i64*, i32) |
85 | 85 |
86 define void @test_atomic_store_64(i32 %iptr, i32 %iptr2, i32 %iptr3, i64 %v) { | 86 define void @test_atomic_store_64(i32 %iptr, i32 %iptr2, i32 %iptr3, i64 %v) { |
87 entry: | 87 entry: |
88 %ptr = inttoptr i32 %iptr to i64* | 88 %ptr = inttoptr i32 %iptr to i64* |
89 %ptr2 = inttoptr i32 %iptr2 to i64* | 89 %ptr2 = inttoptr i32 %iptr2 to i64* |
90 %ptr3 = inttoptr i32 %iptr3 to i64* | 90 %ptr3 = inttoptr i32 %iptr3 to i64* |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
284 three: | 284 three: |
285 %res3 = extractelement <8 x i16> %vec4, i32 7 | 285 %res3 = extractelement <8 x i16> %vec4, i32 7 |
286 %res3_ext = zext i16 %res3 to i32 | 286 %res3_ext = zext i16 %res3 to i32 |
287 ret i32 %res3_ext | 287 ret i32 %res3_ext |
288 } | 288 } |
289 ; CHECK-LABEL: test_pextrw | 289 ; CHECK-LABEL: test_pextrw |
290 ; CHECK-DAG: 66 0f c5 c0 00 pextrw eax,xmm0 | 290 ; CHECK-DAG: 66 0f c5 c0 00 pextrw eax,xmm0 |
291 ; CHECK-DAG: 66 0f c5 c1 02 pextrw eax,xmm1 | 291 ; CHECK-DAG: 66 0f c5 c1 02 pextrw eax,xmm1 |
292 ; CHECK-DAG: 66 0f c5 c2 05 pextrw eax,xmm2 | 292 ; CHECK-DAG: 66 0f c5 c2 05 pextrw eax,xmm2 |
293 ; CHECK-DAG: 66 0f c5 c3 07 pextrw eax,xmm3 | 293 ; CHECK-DAG: 66 0f c5 c3 07 pextrw eax,xmm3 |
OLD | NEW |