CVectorType.asArrayRef(arg,i)
maybeAsArrayRef(arg,i)
                public Object visitPushExpression(SIRPushExpression self,                        CType tapeType,                        JExpression arg) {                    if (! vectorizePush) {                        // vector type does not reach push expression.                        return self;                    }                    // push(e)  =>                    // poke((e).a[0], 0 * outputStride);                    // poke((e).a[1], 1 * outputStride);                    // ...                    // poke((e).a[3], 3 * outputStride);                    // (assuming vector length of 4  4-byte words).                    //                    // Variants: at least on Pentiuum + SSE, storing a SSE register                    // seems no faster than storing individual 4-byte fields, so                    // push(e)  =>                    // push((e).a[0]);                    // poke((e).a[1], 1 * outputStride);                    // ...                    // poke((e).a[3], 3 * outputStride);                    //                    // If we know that pushes were to a buffer with sufficient space                    // (rather than to a communication register or to a variable-                    // length buffer) we could write out-of order to the output buffer.                    // For now, just keep a separate buffer for pokes.                    // since pushing the first element of the vector, the poke buffer                    // is of size ((KjcOptions.vectorize / 4) - 1) * outputStride)                    // and the converted code is:                    // push(e)  =>                    // push((e).a[0]);                    // pokeBuf[head + 0 * outputStride] = (e).a[1];                    // ...                    // pokeBuf[head + 2 * outputStride] = (e).a[3];                    // head++;                    //                    // Important case: if work is "push 1" then                     // we do not need to buffer "pokes"                    // We still write as 4-byte fields since                    // a nuisance to do otherwise: would require casting (supported)                    // and pointer dereference (not supported) to use a single vector                    // store.                    for (int i = 1; i < KjcOptions.vectorize / 4; i++) {                        if (outputStride == 1) {                            this.addPendingStatement(                                new JExpressionStatement(                                        new SIRPushExpression(                                                CVectorType.asArrayRef(arg,i),                                                tapeType)));                        } else {//                         if (canPokeToPushTape)                           //                            this.addPendingStatement(//                                    new JExpressionStatement(//                                            new SIRPokeExpression(//                                                    CVectorType.asArrayRef(arg,i),//                                                    i * outputStride,//                                                    tapeType)));                            this.addPendingStatement(                                new JExpressionStatement(                                    new JAssignmentExpression (                                        new JArrayAccessExpression(                                            pokeBufRef,                                            new JAddExpression(                                                pokeBufOffset,                                                new JIntLiteral((i - 1) * (outputStride - 1)))),                                       CVectorType.asArrayRef(arg,i)                                    )));                        }                    }                    if (outputStride != 1) {                        this.addPendingStatement(                            new JExpressionStatement(                                new JPostfixExpression(                                    at.dms.kjc.Constants.OPE_POSTINC,                                    pokeBufOffset)));                    }                    return new SIRPushExpression(                            CVectorType.asArrayRef(arg,0),                            tapeType);                }