| Index: tests_lit/assembler/x86/opcode_register_encodings.ll
|
| diff --git a/tests_lit/assembler/x86/opcode_register_encodings.ll b/tests_lit/assembler/x86/opcode_register_encodings.ll
|
| index f9378681507bbf12cd7feefa8b7e01c458bf0a58..f159a6bcad76455e9a511bfb08db3a0f0035789b 100644
|
| --- a/tests_lit/assembler/x86/opcode_register_encodings.ll
|
| +++ b/tests_lit/assembler/x86/opcode_register_encodings.ll
|
| @@ -161,4 +161,138 @@ entry:
|
| ; CHECK: 89 51 80 mov dword ptr [ecx - 128], edx
|
| ; CHECK: 89 91 00 01 00 00 mov dword ptr [ecx + 256], edx
|
|
|
| +; The 16-bit pinsrw/pextrw (SSE2) are quite different from
|
| +; the pinsr{b,d}/pextr{b,d} (SSE4.1).
|
| +
|
| +define <4 x i32> @test_pinsrd(<4 x i32> %vec, i32 %elt1, i32 %elt2, i32 %elt3, i32 %elt4) {
|
| +entry:
|
| + %elt12 = add i32 %elt1, %elt2
|
| + %elt34 = add i32 %elt3, %elt4
|
| + %res1 = insertelement <4 x i32> %vec, i32 %elt12, i32 1
|
| + %res2 = insertelement <4 x i32> %res1, i32 %elt34, i32 2
|
| + %res3 = insertelement <4 x i32> %res2, i32 %elt1, i32 3
|
| + ret <4 x i32> %res3
|
| +}
|
| +; CHECK-LABEL: test_pinsrd:
|
| +; CHECK-DAG: 66 0f 3a 22 c{{.*}} 01 pinsrd xmm0, e{{.*}}, 1
|
| +; CHECK-DAG: 66 0f 3a 22 c{{.*}} 02 pinsrd xmm0, e{{.*}}, 2
|
| +; CHECK-DAG: 66 0f 3a 22 c{{.*}} 03 pinsrd xmm0, e{{.*}}, 3
|
| +
|
| +define <16 x i8> @test_pinsrb(<16 x i8> %vec, i32 %elt1_w, i32 %elt2_w, i32 %elt3_w, i32 %elt4_w) {
|
| +entry:
|
| + %elt1 = trunc i32 %elt1_w to i8
|
| + %elt2 = trunc i32 %elt2_w to i8
|
| + %elt3 = trunc i32 %elt3_w to i8
|
| + %elt4 = trunc i32 %elt4_w to i8
|
| + %elt12 = add i8 %elt1, %elt2
|
| + %elt34 = add i8 %elt3, %elt4
|
| + %res1 = insertelement <16 x i8> %vec, i8 %elt12, i32 1
|
| + %res2 = insertelement <16 x i8> %res1, i8 %elt34, i32 7
|
| + %res3 = insertelement <16 x i8> %res2, i8 %elt1, i32 15
|
| + ret <16 x i8> %res3
|
| +}
|
| +; CHECK-LABEL: test_pinsrb:
|
| +; CHECK-DAG: 66 0f 3a 20 c{{.*}} 01 pinsrb xmm0, e{{.*}}, 1
|
| +; CHECK-DAG: 66 0f 3a 20 c{{.*}} 07 pinsrb xmm0, e{{.*}}, 7
|
| +; CHECK-DAG: 66 0f 3a 20 {{.*}} 0f pinsrb xmm0, byte ptr {{.*}}, 15
|
| +
|
| +define <8 x i16> @test_pinsrw(<8 x i16> %vec, i32 %elt1_w, i32 %elt2_w, i32 %elt3_w, i32 %elt4_w) {
|
| +entry:
|
| + %elt1 = trunc i32 %elt1_w to i16
|
| + %elt2 = trunc i32 %elt2_w to i16
|
| + %elt3 = trunc i32 %elt3_w to i16
|
| + %elt4 = trunc i32 %elt4_w to i16
|
| + %elt12 = add i16 %elt1, %elt2
|
| + %elt34 = add i16 %elt3, %elt4
|
| + %res1 = insertelement <8 x i16> %vec, i16 %elt12, i32 1
|
| + %res2 = insertelement <8 x i16> %res1, i16 %elt34, i32 4
|
| + %res3 = insertelement <8 x i16> %res2, i16 %elt1, i32 7
|
| + ret <8 x i16> %res3
|
| +}
|
| +; CHECK-LABEL: test_pinsrw:
|
| +; CHECK-DAG: 66 0f c4 c{{.*}} 01 pinsrw xmm0, e{{.*}}, 1
|
| +; CHECK-DAG: 66 0f c4 c{{.*}} 04 pinsrw xmm0, e{{.*}}, 4
|
| +; CHECK-DAG: 66 0f c4 c{{.*}} 07 pinsrw xmm0, e{{.*}}, 7
|
| +
|
| +define i32 @test_pextrd(i32 %c, <4 x i32> %vec1, <4 x i32> %vec2, <4 x i32> %vec3, <4 x i32> %vec4) {
|
| +entry:
|
| + switch i32 %c, label %three [i32 0, label %zero
|
| + i32 1, label %one
|
| + i32 2, label %two]
|
| +zero:
|
| + %res0 = extractelement <4 x i32> %vec1, i32 0
|
| + ret i32 %res0
|
| +one:
|
| + %res1 = extractelement <4 x i32> %vec2, i32 1
|
| + ret i32 %res1
|
| +two:
|
| + %res2 = extractelement <4 x i32> %vec3, i32 2
|
| + ret i32 %res2
|
| +three:
|
| + %res3 = extractelement <4 x i32> %vec4, i32 3
|
| + ret i32 %res3
|
| +}
|
| +; CHECK-LABEL: test_pextrd
|
| +; CHECK-DAG: 66 0f 3a 16 c0 00 pextrd eax, xmm0, 0
|
| +; CHECK-DAG: 66 0f 3a 16 c8 01 pextrd eax, xmm1, 1
|
| +; CHECK-DAG: 66 0f 3a 16 d0 02 pextrd eax, xmm2, 2
|
| +; CHECK-DAG: 66 0f 3a 16 d8 03 pextrd eax, xmm3, 3
|
| +
|
| +define i32 @test_pextrb(i32 %c, <16 x i8> %vec1, <16 x i8> %vec2, <16 x i8> %vec3, <16 x i8> %vec4) {
|
| +entry:
|
| + switch i32 %c, label %three [i32 0, label %zero
|
| + i32 1, label %one
|
| + i32 2, label %two]
|
| +zero:
|
| + %res0 = extractelement <16 x i8> %vec1, i32 0
|
| + %res0_ext = zext i8 %res0 to i32
|
| + ret i32 %res0_ext
|
| +one:
|
| + %res1 = extractelement <16 x i8> %vec2, i32 6
|
| + %res1_ext = zext i8 %res1 to i32
|
| + ret i32 %res1_ext
|
| +two:
|
| + %res2 = extractelement <16 x i8> %vec3, i32 12
|
| + %res2_ext = zext i8 %res2 to i32
|
| + ret i32 %res2_ext
|
| +three:
|
| + %res3 = extractelement <16 x i8> %vec4, i32 15
|
| + %res3_ext = zext i8 %res3 to i32
|
| + ret i32 %res3_ext
|
| +}
|
| +; CHECK-LABEL: test_pextrb
|
| +; CHECK-DAG: 66 0f 3a 14 c0 00 pextrb eax, xmm0, 0
|
| +; CHECK-DAG: 66 0f 3a 14 c8 06 pextrb eax, xmm1, 6
|
| +; CHECK-DAG: 66 0f 3a 14 d0 0c pextrb eax, xmm2, 12
|
| +; CHECK-DAG: 66 0f 3a 14 d8 0f pextrb eax, xmm3, 15
|
| +
|
| +define i32 @test_pextrw(i32 %c, <8 x i16> %vec1, <8 x i16> %vec2, <8 x i16> %vec3, <8 x i16> %vec4) {
|
| +entry:
|
| + switch i32 %c, label %three [i32 0, label %zero
|
| + i32 1, label %one
|
| + i32 2, label %two]
|
| +zero:
|
| + %res0 = extractelement <8 x i16> %vec1, i32 0
|
| + %res0_ext = zext i16 %res0 to i32
|
| + ret i32 %res0_ext
|
| +one:
|
| + %res1 = extractelement <8 x i16> %vec2, i32 2
|
| + %res1_ext = zext i16 %res1 to i32
|
| + ret i32 %res1_ext
|
| +two:
|
| + %res2 = extractelement <8 x i16> %vec3, i32 5
|
| + %res2_ext = zext i16 %res2 to i32
|
| + ret i32 %res2_ext
|
| +three:
|
| + %res3 = extractelement <8 x i16> %vec4, i32 7
|
| + %res3_ext = zext i16 %res3 to i32
|
| + ret i32 %res3_ext
|
| +}
|
| +; CHECK-LABEL: test_pextrw
|
| +; CHECK-DAG: 66 0f c5 c0 00 pextrw eax, xmm0, 0
|
| +; CHECK-DAG: 66 0f c5 c1 02 pextrw eax, xmm1, 2
|
| +; CHECK-DAG: 66 0f c5 c2 05 pextrw eax, xmm2, 5
|
| +; CHECK-DAG: 66 0f c5 c3 07 pextrw eax, xmm3, 7
|
| +
|
| +
|
| ; ERRORS-NOT: ICE translation error
|
|
|