1 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown < %s | FileCheck %s 2 ; RUN: llc -mcpu=pwr8 -mtriple=powerpc64-unknown-unknown < %s | FileCheck %s \ 3 ; RUN: --check-prefix=CHECK-BE 4 ; RUN: llc -mcpu=pwr7 -mtriple=powerpc64-unknown-unknown < %s | FileCheck %s \ 5 ; RUN: --check-prefix=CHECK-P7 6 7 ; Function Attrs: norecurse nounwind readnone 8 define signext i32 @geti(<4 x i32> %a, i32 signext %b) { 9 entry: 10 %vecext = extractelement <4 x i32> %a, i32 %b 11 ret i32 %vecext 12 ; CHECK-LABEL: @geti 13 ; CHECK-P7-LABEL: @geti 14 ; CHECK-BE-LABEL: @geti 15 ; CHECK-DAG: li [[TRUNCREG:[0-9]+]], 2 16 ; CHECK-DAG: andc [[MASKREG:[0-9]+]], [[TRUNCREG]], 5 17 ; CHECK-DAG: sldi [[SHIFTREG:[0-9]+]], [[MASKREG]], 2 18 ; CHECK-DAG: lvsl [[SHMSKREG:[0-9]+]], 0, [[SHIFTREG]] 19 ; CHECK-DAG: vperm [[PERMVEC:[0-9]+]], 2, 2, [[SHMSKREG]] 20 ; CHECK-DAG: li [[ONEREG:[0-9]+]], 1 21 ; CHECK-DAG: and [[ELEMSREG:[0-9]+]], [[ONEREG]], 5 22 ; CHECK-DAG: sldi [[SHAMREG:[0-9]+]], [[ELEMSREG]], 5 23 ; CHECK: mfvsrd [[TOGPR:[0-9]+]], 24 ; CHECK: srd [[RSHREG:[0-9]+]], [[TOGPR]], [[SHAMREG]] 25 ; CHECK: extsw 3, [[RSHREG]] 26 ; CHECK-P7-DAG: sldi [[ELEMOFFREG:[0-9]+]], 5, 2 27 ; CHECK-P7-DAG: stxvw4x 34, 28 ; CHECK-P7: lwax 3, [[ELEMOFFREG]], 29 ; CHECK-BE-DAG: andi. [[ANDREG:[0-9]+]], 5, 2 30 ; CHECK-BE-DAG: sldi [[SLREG:[0-9]+]], [[ANDREG]], 2 31 ; CHECK-BE-DAG: lvsl [[SHMSKREG:[0-9]+]], 0, [[SLREG]] 32 ; CHECK-BE-DAG: vperm {{[0-9]+}}, 2, 2, [[SHMSKREG]] 33 ; CHECK-BE-DAG: li [[IMMREG:[0-9]+]], 1 34 ; CHECK-BE-DAG: andc [[ANDCREG:[0-9]+]], [[IMMREG]], 5 35 ; CHECK-BE-DAG: sldi [[SHAMREG:[0-9]+]], [[ANDCREG]], 5 36 ; CHECK-BE: mfvsrd [[TOGPR:[0-9]+]], 37 ; CHECK-BE: srd [[RSHREG:[0-9]+]], [[TOGPR]], [[SHAMREG]] 38 ; CHECk-BE: extsw 3, [[RSHREG]] 39 } 40 41 ; Function Attrs: norecurse nounwind readnone 42 define i64 @getl(<2 x i64> %a, i32 signext %b) { 43 entry: 44 %vecext = extractelement <2 x i64> %a, i32 %b 45 ret i64 %vecext 46 ; CHECK-LABEL: @getl 47 ; CHECK-P7-LABEL: @getl 48 ; CHECK-BE-LABEL: @getl 49 ; CHECK-DAG: li [[TRUNCREG:[0-9]+]], 1 50 ; CHECK-DAG: andc [[MASKREG:[0-9]+]], [[TRUNCREG]], 5 51 ; CHECK-DAG: sldi [[SHIFTREG:[0-9]+]], [[MASKREG]], 3 52 ; CHECK-DAG: lvsl [[SHMSKREG:[0-9]+]], 0, [[SHIFTREG]] 53 ; CHECK-DAG: vperm [[PERMVEC:[0-9]+]], 2, 2, [[SHMSKREG]] 54 ; CHECK: mfvsrd 3, 55 ; CHECK-P7-DAG: sldi [[ELEMOFFREG:[0-9]+]], 5, 3 56 ; CHECK-P7-DAG: stxvd2x 34, 57 ; CHECK-P7: ldx 3, [[ELEMOFFREG]], 58 ; CHECK-BE-DAG: andi. [[ANDREG:[0-9]+]], 5, 1 59 ; CHECK-BE-DAG: sldi [[SLREG:[0-9]+]], [[ANDREG]], 3 60 ; CHECK-BE-DAG: lvsl [[SHMSKREG:[0-9]+]], 0, [[SLREG]] 61 ; CHECK-BE-DAG: vperm {{[0-9]+}}, 2, 2, [[SHMSKREG]] 62 ; CHECK-BE: mfvsrd 3, 63 } 64 65 ; Function Attrs: norecurse nounwind readnone 66 define float @getf(<4 x float> %a, i32 signext %b) { 67 entry: 68 %vecext = extractelement <4 x float> %a, i32 %b 69 ret float %vecext 70 ; CHECK-LABEL: @getf 71 ; CHECK-P7-LABEL: @getf 72 ; CHECK-BE-LABEL: @getf 73 ; CHECK: li [[IMMREG:[0-9]+]], 3 74 ; CHECK: xor [[TRUNCREG:[0-9]+]], [[IMMREG]], 5 75 ; CHECK: lvsl [[SHMSKREG:[0-9]+]], 0, [[TRUNCREG]] 76 ; CHECK: vperm {{[0-9]+}}, 2, 2, [[SHMSKREG]] 77 ; CHECK: xscvspdpn 1, 78 ; CHECK-P7-DAG: sldi [[ELEMOFFREG:[0-9]+]], 5, 2 79 ; CHECK-P7-DAG: stxvw4x 34, 80 ; CHECK-P7: lfsx 1, [[ELEMOFFREG]], 81 ; CHECK-BE: sldi [[ELNOREG:[0-9]+]], 5, 2 82 ; CHECK-BE: lvsl [[SHMSKREG:[0-9]+]], 0, [[ELNOREG]] 83 ; CHECK-BE: vperm {{[0-9]+}}, 2, 2, [[SHMSKREG]] 84 ; CHECK-BE: xscvspdpn 1, 85 } 86 87 ; Function Attrs: norecurse nounwind readnone 88 define double @getd(<2 x double> %a, i32 signext %b) { 89 entry: 90 %vecext = extractelement <2 x double> %a, i32 %b 91 ret double %vecext 92 ; CHECK-LABEL: @getd 93 ; CHECK-P7-LABEL: @getd 94 ; CHECK-BE-LABEL: @getd 95 ; CHECK: li [[TRUNCREG:[0-9]+]], 1 96 ; CHECK: andc [[MASKREG:[0-9]+]], [[TRUNCREG]], 5 97 ; CHECK: sldi [[SHIFTREG:[0-9]+]], [[MASKREG]], 3 98 ; CHECK: lvsl [[SHMSKREG:[0-9]+]], 0, [[SHIFTREG]] 99 ; CHECK: vperm {{[0-9]+}}, 2, 2, [[SHMSKREG]] 100 ; FIXME: the instruction below is a redundant regclass copy, to be removed 101 ; CHECK: xxlor 1, 102 ; CHECK-P7-DAG: andi. [[ANDREG:[0-9]+]], 5, 1 103 ; CHECK-P7-DAG: sldi [[SLREG:[0-9]+]], [[ANDREG]], 3 104 ; CHECK-P7-DAG: lvsl [[SHMSKREG:[0-9]+]], 0, [[SLREG]] 105 ; CHECK-P7-DAG: vperm {{[0-9]+}}, 2, 2, [[SHMSKREG]] 106 ; FIXME: the instruction below is a redundant regclass copy, to be removed 107 ; CHECK-P7: xxlor 1, 108 ; CHECK-BE-DAG: andi. [[ANDREG:[0-9]+]], 5, 1 109 ; CHECK-BE-DAG: sldi [[SLREG:[0-9]+]], [[ANDREG]], 3 110 ; CHECK-BE-DAG: lvsl [[SHMSKREG:[0-9]+]], 0, [[SLREG]] 111 ; CHECK-BE-DAG: vperm {{[0-9]+}}, 2, 2, [[SHMSKREG]] 112 ; FIXME: the instruction below is a redundant regclass copy, to be removed 113 ; CHECK-BE: xxlor 1, 114 } 115