diff options
| author | Craig Topper <craig.topper@gmail.com> | 2011-12-06 05:31:16 +0000 | 
|---|---|---|
| committer | Craig Topper <craig.topper@gmail.com> | 2011-12-06 05:31:16 +0000 | 
| commit | 3cb802c775b4ac9909f3040483f97538308b71e9 (patch) | |
| tree | e4b933136a1bcd1b887a58c629e0597c8046cc78 | |
| parent | e303e24d7713b85a1211fdcc1a3d63e6caa604c2 (diff) | |
| download | bcm5719-llvm-3cb802c775b4ac9909f3040483f97538308b71e9.tar.gz bcm5719-llvm-3cb802c775b4ac9909f3040483f97538308b71e9.zip | |
Clean up some of the shuffle decoding code for UNPCK instructions. Add instruction commenting for AVX/AVX2 forms for integer UNPCKs.
llvm-svn: 145924
| -rw-r--r-- | llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp | 168 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp | 39 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/Utils/X86ShuffleDecode.h | 26 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 8 | 
4 files changed, 157 insertions, 84 deletions
| diff --git a/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp b/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp index 59920ad9acf..6e4b1b985ad 100644 --- a/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp +++ b/llvm/lib/Target/X86/InstPrinter/X86InstComments.cpp @@ -106,28 +106,92 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      // FALL THROUGH.    case X86::PUNPCKHBWrm:      Src1Name = getRegName(MI->getOperand(0).getReg()); -    DecodePUNPCKHMask(16, ShuffleMask); +    DecodeUNPCKHMask(MVT::v16i8, ShuffleMask); +    break; +  case X86::VPUNPCKHBWrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKHBWrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKHMask(MVT::v16i8, ShuffleMask); +    break; +  case X86::VPUNPCKHBWYrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKHBWYrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKHMask(MVT::v32i8, ShuffleMask);      break;    case X86::PUNPCKHWDrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::PUNPCKHWDrm:      Src1Name = getRegName(MI->getOperand(0).getReg()); -    DecodePUNPCKHMask(8, ShuffleMask); +    DecodeUNPCKHMask(MVT::v8i16, ShuffleMask); +    break; +  case X86::VPUNPCKHWDrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKHWDrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKHMask(MVT::v8i16, ShuffleMask); +    break; +  case X86::VPUNPCKHWDYrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKHWDYrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKHMask(MVT::v16i16, ShuffleMask);      break;    case X86::PUNPCKHDQrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::PUNPCKHDQrm:      Src1Name = getRegName(MI->getOperand(0).getReg()); -    DecodePUNPCKHMask(4, ShuffleMask); +    DecodeUNPCKHMask(MVT::v4i32, ShuffleMask); +    break; +  case X86::VPUNPCKHDQrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKHDQrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKHMask(MVT::v4i32, ShuffleMask); +    break; +  case X86::VPUNPCKHDQYrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKHDQYrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKHMask(MVT::v8i32, ShuffleMask);      break;    case X86::PUNPCKHQDQrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::PUNPCKHQDQrm:      Src1Name = getRegName(MI->getOperand(0).getReg()); -    DecodePUNPCKHMask(2, ShuffleMask); +    DecodeUNPCKHMask(MVT::v2i64, ShuffleMask); +    break; +  case X86::VPUNPCKHQDQrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKHQDQrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKHMask(MVT::v2i64, ShuffleMask); +    break; +  case X86::VPUNPCKHQDQYrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKHQDQYrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKHMask(MVT::v4i64, ShuffleMask);      break;    case X86::PUNPCKLBWrr: @@ -135,28 +199,92 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      // FALL THROUGH.    case X86::PUNPCKLBWrm:      Src1Name = getRegName(MI->getOperand(0).getReg()); -    DecodePUNPCKLBWMask(16, ShuffleMask); +    DecodeUNPCKLMask(MVT::v16i8, ShuffleMask); +    break; +  case X86::VPUNPCKLBWrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKLBWrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKLMask(MVT::v16i8, ShuffleMask); +    break; +  case X86::VPUNPCKLBWYrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKLBWYrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKLMask(MVT::v32i8, ShuffleMask);      break;    case X86::PUNPCKLWDrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::PUNPCKLWDrm:      Src1Name = getRegName(MI->getOperand(0).getReg()); -    DecodePUNPCKLWDMask(8, ShuffleMask); +    DecodeUNPCKLMask(MVT::v8i16, ShuffleMask); +    break; +  case X86::VPUNPCKLWDrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKLWDrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKLMask(MVT::v8i16, ShuffleMask); +    break; +  case X86::VPUNPCKLWDYrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKLWDYrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKLMask(MVT::v16i16, ShuffleMask);      break;    case X86::PUNPCKLDQrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::PUNPCKLDQrm:      Src1Name = getRegName(MI->getOperand(0).getReg()); -    DecodePUNPCKLDQMask(4, ShuffleMask); +    DecodeUNPCKLMask(MVT::v4i32, ShuffleMask); +    break; +  case X86::VPUNPCKLDQrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKLDQrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKLMask(MVT::v4i32, ShuffleMask); +    break; +  case X86::VPUNPCKLDQYrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKLDQYrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKLMask(MVT::v8i32, ShuffleMask);      break;    case X86::PUNPCKLQDQrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::PUNPCKLQDQrm:      Src1Name = getRegName(MI->getOperand(0).getReg()); -    DecodePUNPCKLQDQMask(2, ShuffleMask); +    DecodeUNPCKLMask(MVT::v2i64, ShuffleMask); +    break; +  case X86::VPUNPCKLQDQrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKLQDQrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKLMask(MVT::v2i64, ShuffleMask); +    break; +  case X86::VPUNPCKLQDQYrr: +    Src2Name = getRegName(MI->getOperand(2).getReg()); +    // FALL THROUGH. +  case X86::VPUNPCKLQDQYrm: +    Src1Name = getRegName(MI->getOperand(1).getReg()); +    DestName = getRegName(MI->getOperand(0).getReg()); +    DecodeUNPCKLMask(MVT::v4i64, ShuffleMask);      break;    case X86::SHUFPDrri: @@ -217,14 +345,14 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::UNPCKLPDrm: -    DecodeUNPCKLPMask(MVT::v2f64, ShuffleMask); +    DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);      Src1Name = getRegName(MI->getOperand(0).getReg());      break;    case X86::VUNPCKLPDrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::VUNPCKLPDrm: -    DecodeUNPCKLPMask(MVT::v2f64, ShuffleMask); +    DecodeUNPCKLMask(MVT::v2f64, ShuffleMask);      Src1Name = getRegName(MI->getOperand(1).getReg());      DestName = getRegName(MI->getOperand(0).getReg());      break; @@ -232,7 +360,7 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::VUNPCKLPDYrm: -    DecodeUNPCKLPMask(MVT::v4f64, ShuffleMask); +    DecodeUNPCKLMask(MVT::v4f64, ShuffleMask);      Src1Name = getRegName(MI->getOperand(1).getReg());      DestName = getRegName(MI->getOperand(0).getReg());      break; @@ -240,14 +368,14 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::UNPCKLPSrm: -    DecodeUNPCKLPMask(MVT::v4f32, ShuffleMask); +    DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);      Src1Name = getRegName(MI->getOperand(0).getReg());      break;    case X86::VUNPCKLPSrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::VUNPCKLPSrm: -    DecodeUNPCKLPMask(MVT::v4f32, ShuffleMask); +    DecodeUNPCKLMask(MVT::v4f32, ShuffleMask);      Src1Name = getRegName(MI->getOperand(1).getReg());      DestName = getRegName(MI->getOperand(0).getReg());      break; @@ -255,7 +383,7 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::VUNPCKLPSYrm: -    DecodeUNPCKLPMask(MVT::v8f32, ShuffleMask); +    DecodeUNPCKLMask(MVT::v8f32, ShuffleMask);      Src1Name = getRegName(MI->getOperand(1).getReg());      DestName = getRegName(MI->getOperand(0).getReg());      break; @@ -263,14 +391,14 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::UNPCKHPDrm: -    DecodeUNPCKHPMask(MVT::v2f64, ShuffleMask); +    DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);      Src1Name = getRegName(MI->getOperand(0).getReg());      break;    case X86::VUNPCKHPDrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::VUNPCKHPDrm: -    DecodeUNPCKHPMask(MVT::v2f64, ShuffleMask); +    DecodeUNPCKHMask(MVT::v2f64, ShuffleMask);      Src1Name = getRegName(MI->getOperand(1).getReg());      DestName = getRegName(MI->getOperand(0).getReg());      break; @@ -278,7 +406,7 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::VUNPCKHPDYrm: -    DecodeUNPCKLPMask(MVT::v4f64, ShuffleMask); +    DecodeUNPCKHMask(MVT::v4f64, ShuffleMask);      Src1Name = getRegName(MI->getOperand(1).getReg());      DestName = getRegName(MI->getOperand(0).getReg());      break; @@ -286,14 +414,14 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::UNPCKHPSrm: -    DecodeUNPCKHPMask(MVT::v4f32, ShuffleMask); +    DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);      Src1Name = getRegName(MI->getOperand(0).getReg());      break;    case X86::VUNPCKHPSrr:      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::VUNPCKHPSrm: -    DecodeUNPCKHPMask(MVT::v4f32, ShuffleMask); +    DecodeUNPCKHMask(MVT::v4f32, ShuffleMask);      Src1Name = getRegName(MI->getOperand(1).getReg());      DestName = getRegName(MI->getOperand(0).getReg());      break; @@ -301,7 +429,7 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,      Src2Name = getRegName(MI->getOperand(2).getReg());      // FALL THROUGH.    case X86::VUNPCKHPSYrm: -    DecodeUNPCKHPMask(MVT::v8f32, ShuffleMask); +    DecodeUNPCKHMask(MVT::v8f32, ShuffleMask);      Src1Name = getRegName(MI->getOperand(1).getReg());      DestName = getRegName(MI->getOperand(0).getReg());      break; diff --git a/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp b/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp index daca2401678..e7631b65577 100644 --- a/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp +++ b/llvm/lib/Target/X86/Utils/X86ShuffleDecode.cpp @@ -95,39 +95,6 @@ void DecodePSHUFLWMask(unsigned Imm,    ShuffleMask.push_back(7);  } -void DecodePUNPCKLBWMask(unsigned NElts, -                         SmallVectorImpl<unsigned> &ShuffleMask) { -  DecodeUNPCKLPMask(MVT::getVectorVT(MVT::i8, NElts), ShuffleMask); -} - -void DecodePUNPCKLWDMask(unsigned NElts, -                         SmallVectorImpl<unsigned> &ShuffleMask) { -  DecodeUNPCKLPMask(MVT::getVectorVT(MVT::i16, NElts), ShuffleMask); -} - -void DecodePUNPCKLDQMask(unsigned NElts, -                         SmallVectorImpl<unsigned> &ShuffleMask) { -  DecodeUNPCKLPMask(MVT::getVectorVT(MVT::i32, NElts), ShuffleMask); -} - -void DecodePUNPCKLQDQMask(unsigned NElts, -                          SmallVectorImpl<unsigned> &ShuffleMask) { -  DecodeUNPCKLPMask(MVT::getVectorVT(MVT::i64, NElts), ShuffleMask); -} - -void DecodePUNPCKLMask(EVT VT, -                       SmallVectorImpl<unsigned> &ShuffleMask) { -  DecodeUNPCKLPMask(VT, ShuffleMask); -} - -void DecodePUNPCKHMask(unsigned NElts, -                       SmallVectorImpl<unsigned> &ShuffleMask) { -  for (unsigned i = 0; i != NElts/2; ++i) { -    ShuffleMask.push_back(i+NElts/2); -    ShuffleMask.push_back(i+NElts+NElts/2); -  } -} -  void DecodeSHUFPMask(EVT VT, unsigned Imm,                       SmallVectorImpl<unsigned> &ShuffleMask) {    unsigned NumElts = VT.getVectorNumElements(); @@ -152,7 +119,7 @@ void DecodeSHUFPMask(EVT VT, unsigned Imm,    }  } -void DecodeUNPCKHPMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask) { +void DecodeUNPCKHMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask) {    unsigned NumElts = VT.getVectorNumElements();    // Handle 128 and 256-bit vector lengths. AVX defines UNPCK* to operate @@ -171,10 +138,10 @@ void DecodeUNPCKHPMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask) {    }  } -/// DecodeUNPCKLPMask - This decodes the shuffle masks for unpcklps/unpcklpd +/// DecodeUNPCKLMask - This decodes the shuffle masks for unpcklps/unpcklpd  /// etc.  VT indicates the type of the vector allowing it to handle different  /// datatypes and vector widths. -void DecodeUNPCKLPMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask) { +void DecodeUNPCKLMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask) {    unsigned NumElts = VT.getVectorNumElements();    // Handle 128 and 256-bit vector lengths. AVX defines UNPCK* to operate diff --git a/llvm/lib/Target/X86/Utils/X86ShuffleDecode.h b/llvm/lib/Target/X86/Utils/X86ShuffleDecode.h index 74c34b412bc..243728f81e3 100644 --- a/llvm/lib/Target/X86/Utils/X86ShuffleDecode.h +++ b/llvm/lib/Target/X86/Utils/X86ShuffleDecode.h @@ -46,36 +46,18 @@ void DecodePSHUFHWMask(unsigned Imm,  void DecodePSHUFLWMask(unsigned Imm,                         SmallVectorImpl<unsigned> &ShuffleMask); -void DecodePUNPCKLBWMask(unsigned NElts, -                         SmallVectorImpl<unsigned> &ShuffleMask); - -void DecodePUNPCKLWDMask(unsigned NElts, -                         SmallVectorImpl<unsigned> &ShuffleMask); - -void DecodePUNPCKLDQMask(unsigned NElts, -                         SmallVectorImpl<unsigned> &ShuffleMask); - -void DecodePUNPCKLQDQMask(unsigned NElts, -                          SmallVectorImpl<unsigned> &ShuffleMask); - -void DecodePUNPCKLMask(EVT VT, -                       SmallVectorImpl<unsigned> &ShuffleMask); - -void DecodePUNPCKHMask(unsigned NElts, -                       SmallVectorImpl<unsigned> &ShuffleMask); -  void DecodeSHUFPMask(EVT VT, unsigned Imm,                       SmallVectorImpl<unsigned> &ShuffleMask); -/// DecodeUNPCKHPMask - This decodes the shuffle masks for unpckhps/unpckhpd +/// DecodeUNPCKHMask - This decodes the shuffle masks for unpckhps/unpckhpd  /// etc.  VT indicates the type of the vector allowing it to handle different  /// datatypes and vector widths. -void DecodeUNPCKHPMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask); +void DecodeUNPCKHMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask); -/// DecodeUNPCKLPMask - This decodes the shuffle masks for unpcklps/unpcklpd +/// DecodeUNPCKLMask - This decodes the shuffle masks for unpcklps/unpcklpd  /// etc.  VT indicates the type of the vector allowing it to handle different  /// datatypes and vector widths. -void DecodeUNPCKLPMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask); +void DecodeUNPCKLMask(EVT VT, SmallVectorImpl<unsigned> &ShuffleMask);  // DecodeVPERMILPMask - Decodes VPERMILPS/ VPERMILPD permutes for any 128-bit diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 7df931fdd4e..169e41b195b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -4461,16 +4461,12 @@ static SDValue getShuffleScalarElt(SDNode *N, int Index, SelectionDAG &DAG,                        ShuffleMask);        break;      case X86ISD::PUNPCKH: -      DecodePUNPCKHMask(NumElems, ShuffleMask); -      break;      case X86ISD::UNPCKHP: -      DecodeUNPCKHPMask(VT, ShuffleMask); +      DecodeUNPCKHMask(VT, ShuffleMask);        break;      case X86ISD::PUNPCKL: -      DecodePUNPCKLMask(VT, ShuffleMask); -      break;      case X86ISD::UNPCKLP: -      DecodeUNPCKLPMask(VT, ShuffleMask); +      DecodeUNPCKLMask(VT, ShuffleMask);        break;      case X86ISD::MOVHLPS:        DecodeMOVHLPSMask(NumElems, ShuffleMask); | 

