-
- switch (VT.getSimpleVT()) {
- default:
- cerr << "LowerEXTRACT_VECTOR_ELT(varable): Unhandled vector type\n";
- abort();
- /*NOTREACHED*/
- case MVT::i8: {
- // Don't need to scale, but we do need to correct for where bytes go in
- // slot 0:
- SDValue prefSlot = DAG.getNode(ISD::SUB, MVT::i32,
- Elt, DAG.getConstant(3, MVT::i32));
- SDValue corrected = DAG.getNode(ISD::ADD, MVT::i32, prefSlot,
- DAG.getConstant(16, MVT::i32));
-
- SDValue shiftAmt = DAG.getNode(ISD::SELECT_CC, MVT::i32,
- prefSlot, DAG.getConstant(0, MVT::i32),
- prefSlot, // trueval
- corrected, // falseval
- DAG.getCondCode(ISD::SETGT));
- vecShift = DAG.getNode(SPUISD::ROTBYTES_LEFT, VecVT, N, shiftAmt);
- break;
- }
- case MVT::i16: {
- // Scale the index to bytes, subtract for preferred slot:
- Elt = DAG.getNode(ISD::SHL, MVT::i32, Elt,
- DAG.getConstant(scaleFactor.logBase2(), MVT::i32));
- SDValue prefSlot = DAG.getNode(ISD::SUB, MVT::i32,
- Elt, DAG.getConstant(2, MVT::i32));
- SDValue corrected = DAG.getNode(ISD::ADD, MVT::i32, prefSlot,
- DAG.getConstant(16, MVT::i32));
-
- SDValue shiftAmt = DAG.getNode(ISD::SELECT_CC, MVT::i32,
- prefSlot, DAG.getConstant(0, MVT::i32),
- prefSlot, // trueval
- corrected, // falseval
- DAG.getCondCode(ISD::SETGT));
- vecShift = DAG.getNode(SPUISD::ROTBYTES_LEFT, VecVT, N, shiftAmt);
- break;
- }
- case MVT::i32:
- case MVT::f32:
- case MVT::i64:
- case MVT::f64:
- // Simple left shift to slot 0