102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------
202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo
302f5b5447de349216a40086ca6061efefb5a3025James Dong *
402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License");
502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License.
602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at
702f5b5447de349216a40086ca6061efefb5a3025James Dong *
802f5b5447de349216a40086ca6061efefb5a3025James Dong *      http://www.apache.org/licenses/LICENSE-2.0
902f5b5447de349216a40086ca6061efefb5a3025James Dong *
1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software
1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS,
1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied.
1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions
1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License.
1602f5b5447de349216a40086ca6061efefb5a3025James Dong * -------------------------------------------------------------------
1702f5b5447de349216a40086ca6061efefb5a3025James Dong */
1802f5b5447de349216a40086ca6061efefb5a3025James Dong/*
1902f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
2002f5b5447de349216a40086ca6061efefb5a3025James Dong INPUT AND OUTPUT DEFINITIONS
2102f5b5447de349216a40086ca6061efefb5a3025James Dong
2202f5b5447de349216a40086ca6061efefb5a3025James Dong Inputs:
2302f5b5447de349216a40086ca6061efefb5a3025James Dong    xpos = x half-pixel of (x,y) coordinates within a VOP; motion
2402f5b5447de349216a40086ca6061efefb5a3025James Dong           compensated coordinates; native type
2502f5b5447de349216a40086ca6061efefb5a3025James Dong    ypos = y half-pixel of (x,y) coordinates within a VOP; motion
2602f5b5447de349216a40086ca6061efefb5a3025James Dong           compensated coordinates; native type
2702f5b5447de349216a40086ca6061efefb5a3025James Dong    comp = pointer to 8-bit compensated prediction values within a VOP;
2802f5b5447de349216a40086ca6061efefb5a3025James Dong        computed by this module (i/o); full-pel resolution
2902f5b5447de349216a40086ca6061efefb5a3025James Dong    c_prev = pointer to previous 8-bit prediction values within a VOP;
3002f5b5447de349216a40086ca6061efefb5a3025James Dong          values range from (0-255); full-pel resolution
3102f5b5447de349216a40086ca6061efefb5a3025James Dong    sh_d = pointer to residual values used to compensate the predicted
3202f5b5447de349216a40086ca6061efefb5a3025James Dong        value; values range from (-512 to 511); full-pel resolution
3302f5b5447de349216a40086ca6061efefb5a3025James Dong    width = width of the VOP in pixels (x axis); full-pel resolution
3402f5b5447de349216a40086ca6061efefb5a3025James Dong    rnd1 = rounding value for case when one dimension uses half-pel
3502f5b5447de349216a40086ca6061efefb5a3025James Dong           resolution
3602f5b5447de349216a40086ca6061efefb5a3025James Dong    rnd2 = rounding value for case when two dimensions uses half-pel
3702f5b5447de349216a40086ca6061efefb5a3025James Dong           resolution
3802f5b5447de349216a40086ca6061efefb5a3025James Dong    CBP = flag indicating whether residual is all zeros
3902f5b5447de349216a40086ca6061efefb5a3025James Dong          (0 -> all zeros, 1 -> not all zeros)
4002f5b5447de349216a40086ca6061efefb5a3025James Dong        outside_flag = flag indicating whether motion vector is outside the
4102f5b5447de349216a40086ca6061efefb5a3025James Dong               VOP (0 -> inside, 1 -> outside)
4202f5b5447de349216a40086ca6061efefb5a3025James Dong
4302f5b5447de349216a40086ca6061efefb5a3025James Dong Outputs:
4402f5b5447de349216a40086ca6061efefb5a3025James Dong    returns 1
4502f5b5447de349216a40086ca6061efefb5a3025James Dong
4602f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores/Buffers/Pointers Needed:
4702f5b5447de349216a40086ca6061efefb5a3025James Dong    None
4802f5b5447de349216a40086ca6061efefb5a3025James Dong
4902f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores/Buffers/Pointers Needed:
5002f5b5447de349216a40086ca6061efefb5a3025James Dong    None
5102f5b5447de349216a40086ca6061efefb5a3025James Dong
5202f5b5447de349216a40086ca6061efefb5a3025James Dong Pointers and Buffers Modified:
5302f5b5447de349216a40086ca6061efefb5a3025James Dong    comp = buffer contains newly computed compensated prediction values
5402f5b5447de349216a40086ca6061efefb5a3025James Dong
5502f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores Modified:
5602f5b5447de349216a40086ca6061efefb5a3025James Dong    None
5702f5b5447de349216a40086ca6061efefb5a3025James Dong
5802f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores Modified:
5902f5b5447de349216a40086ca6061efefb5a3025James Dong    None
6002f5b5447de349216a40086ca6061efefb5a3025James Dong
6102f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
6202f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION DESCRIPTION
6302f5b5447de349216a40086ca6061efefb5a3025James Dong
6402f5b5447de349216a40086ca6061efefb5a3025James Dong Compute pixel values for a block in the current VOP. The prediction
6502f5b5447de349216a40086ca6061efefb5a3025James Dong values are generated by averaging pixel values in the previous VOP; the
6602f5b5447de349216a40086ca6061efefb5a3025James Dong block position in the previous frame is computed from the current block's
6702f5b5447de349216a40086ca6061efefb5a3025James Dong motion vector. The computed pixel values are then computed by adding the
6802f5b5447de349216a40086ca6061efefb5a3025James Dong prediction values to the block residual values.
6902f5b5447de349216a40086ca6061efefb5a3025James Dong
7002f5b5447de349216a40086ca6061efefb5a3025James Dong
7102f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------
7202f5b5447de349216a40086ca6061efefb5a3025James Dong*/
7302f5b5447de349216a40086ca6061efefb5a3025James Dong
7402f5b5447de349216a40086ca6061efefb5a3025James Dong/*----------------------------------------------------------------------------
7502f5b5447de349216a40086ca6061efefb5a3025James Dong; INCLUDES
7602f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/
7702f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h"
7802f5b5447de349216a40086ca6061efefb5a3025James Dong#include "motion_comp.h"
7902f5b5447de349216a40086ca6061efefb5a3025James Dong
8002f5b5447de349216a40086ca6061efefb5a3025James Dong#define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA
8102f5b5447de349216a40086ca6061efefb5a3025James Dong
8202f5b5447de349216a40086ca6061efefb5a3025James Dongint GetPredAdvancedBy0x0(
8302f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *prev,        /* i */
8402f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pred_block,      /* i */
8502f5b5447de349216a40086ca6061efefb5a3025James Dong    int width,      /* i */
8602f5b5447de349216a40086ca6061efefb5a3025James Dong    int pred_width_rnd /* i */
8702f5b5447de349216a40086ca6061efefb5a3025James Dong)
8802f5b5447de349216a40086ca6061efefb5a3025James Dong{
8902f5b5447de349216a40086ca6061efefb5a3025James Dong    uint    i;      /* loop variable */
9002f5b5447de349216a40086ca6061efefb5a3025James Dong    int offset, offset2;
9102f5b5447de349216a40086ca6061efefb5a3025James Dong    uint32  pred_word, word1, word2;
9202f5b5447de349216a40086ca6061efefb5a3025James Dong    int tmp;
9302f5b5447de349216a40086ca6061efefb5a3025James Dong
9402f5b5447de349216a40086ca6061efefb5a3025James Dong    /* initialize offset to adjust pixel counter */
9502f5b5447de349216a40086ca6061efefb5a3025James Dong    /*    the next row; full-pel resolution      */
9602f5b5447de349216a40086ca6061efefb5a3025James Dong    offset = width - B_SIZE; /* offset for prev */
9702f5b5447de349216a40086ca6061efefb5a3025James Dong    offset2 = (pred_width_rnd >> 1) - 4; /* offset for pred_block */
9802f5b5447de349216a40086ca6061efefb5a3025James Dong
9902f5b5447de349216a40086ca6061efefb5a3025James Dong    tmp = (uint32)prev & 0x3;
10002f5b5447de349216a40086ca6061efefb5a3025James Dong    pred_block -= offset2; /* preset */
10102f5b5447de349216a40086ca6061efefb5a3025James Dong
10202f5b5447de349216a40086ca6061efefb5a3025James Dong    if (tmp == 0)  /* word-aligned */
10302f5b5447de349216a40086ca6061efefb5a3025James Dong    {
10402f5b5447de349216a40086ca6061efefb5a3025James Dong        for (i = B_SIZE; i > 0; i--)
10502f5b5447de349216a40086ca6061efefb5a3025James Dong        {
10602f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += offset2)) = *((uint32*)prev);
10702f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = *((uint32*)(prev + 4));
10802f5b5447de349216a40086ca6061efefb5a3025James Dong            prev += width;
10902f5b5447de349216a40086ca6061efefb5a3025James Dong        }
11002f5b5447de349216a40086ca6061efefb5a3025James Dong        return 1;
11102f5b5447de349216a40086ca6061efefb5a3025James Dong    }
11202f5b5447de349216a40086ca6061efefb5a3025James Dong    else if (tmp == 1) /* first position */
11302f5b5447de349216a40086ca6061efefb5a3025James Dong    {
11402f5b5447de349216a40086ca6061efefb5a3025James Dong        prev--; /* word-aligned */
11502f5b5447de349216a40086ca6061efefb5a3025James Dong
11602f5b5447de349216a40086ca6061efefb5a3025James Dong        for (i = B_SIZE; i > 0; i--)
11702f5b5447de349216a40086ca6061efefb5a3025James Dong        {
11802f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 = *((uint32*)prev); /* read 4 bytes, b4 b3 b2 b1 */
11902f5b5447de349216a40086ca6061efefb5a3025James Dong            word2 = *((uint32*)(prev += 4));  /* read 4 bytes, b8 b7 b6 b5 */
12002f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 >>= 8; /* 0 b4 b3 b2 */
12102f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_word = word1 | (word2 << 24);  /* b5 b4 b3 b2 */
12202f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += offset2)) = pred_word;
12302f5b5447de349216a40086ca6061efefb5a3025James Dong
12402f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */
12502f5b5447de349216a40086ca6061efefb5a3025James Dong            word2 >>= 8; /* 0 b8 b7 b6 */
12602f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_word = word2 | (word1 << 24); /* b9 b8 b7 b6 */
12702f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = pred_word;
12802f5b5447de349216a40086ca6061efefb5a3025James Dong
12902f5b5447de349216a40086ca6061efefb5a3025James Dong            prev += offset;
13002f5b5447de349216a40086ca6061efefb5a3025James Dong        }
13102f5b5447de349216a40086ca6061efefb5a3025James Dong
13202f5b5447de349216a40086ca6061efefb5a3025James Dong        return 1;
13302f5b5447de349216a40086ca6061efefb5a3025James Dong    }
13402f5b5447de349216a40086ca6061efefb5a3025James Dong    else if (tmp == 2) /* second position */
13502f5b5447de349216a40086ca6061efefb5a3025James Dong    {
13602f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 2; /* word1-aligned */
13702f5b5447de349216a40086ca6061efefb5a3025James Dong
13802f5b5447de349216a40086ca6061efefb5a3025James Dong        for (i = B_SIZE; i > 0; i--)
13902f5b5447de349216a40086ca6061efefb5a3025James Dong        {
14002f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 = *((uint32*)prev); /* read 4 bytes, b4 b3 b2 b1 */
14102f5b5447de349216a40086ca6061efefb5a3025James Dong            word2 = *((uint32*)(prev += 4));  /* read 4 bytes, b8 b7 b6 b5 */
14202f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 >>= 16; /* 0 0 b4 b3 */
14302f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_word = word1 | (word2 << 16);  /* b6 b5 b4 b3 */
14402f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += offset2)) = pred_word;
14502f5b5447de349216a40086ca6061efefb5a3025James Dong
14602f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */
14702f5b5447de349216a40086ca6061efefb5a3025James Dong            word2 >>= 16; /* 0 0 b8 b7 */
14802f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_word = word2 | (word1 << 16); /* b10 b9 b8 b7 */
14902f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = pred_word;
15002f5b5447de349216a40086ca6061efefb5a3025James Dong
15102f5b5447de349216a40086ca6061efefb5a3025James Dong
15202f5b5447de349216a40086ca6061efefb5a3025James Dong            prev += offset;
15302f5b5447de349216a40086ca6061efefb5a3025James Dong        }
15402f5b5447de349216a40086ca6061efefb5a3025James Dong
15502f5b5447de349216a40086ca6061efefb5a3025James Dong        return 1;
15602f5b5447de349216a40086ca6061efefb5a3025James Dong    }
15702f5b5447de349216a40086ca6061efefb5a3025James Dong    else /* third position */
15802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
15902f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 3; /* word1-aligned */
16002f5b5447de349216a40086ca6061efefb5a3025James Dong
16102f5b5447de349216a40086ca6061efefb5a3025James Dong        for (i = B_SIZE; i > 0; i--)
16202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
16302f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 = *((uint32*)prev); /* read 4 bytes, b4 b3 b2 b1 */
16402f5b5447de349216a40086ca6061efefb5a3025James Dong            word2 = *((uint32*)(prev += 4));  /* read 4 bytes, b8 b7 b6 b5 */
16502f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 >>= 24; /* 0 0 0 b4 */
16602f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_word = word1 | (word2 << 8);   /* b7 b6 b5 b4 */
16702f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += offset2)) = pred_word;
16802f5b5447de349216a40086ca6061efefb5a3025James Dong
16902f5b5447de349216a40086ca6061efefb5a3025James Dong            word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */
17002f5b5447de349216a40086ca6061efefb5a3025James Dong            word2 >>= 24; /* 0 0 0 b8 */
17102f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_word = word2 | (word1 << 8); /* b11 b10 b9 b8 */
17202f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = pred_word;
17302f5b5447de349216a40086ca6061efefb5a3025James Dong
17402f5b5447de349216a40086ca6061efefb5a3025James Dong            prev += offset;
17502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
17602f5b5447de349216a40086ca6061efefb5a3025James Dong
17702f5b5447de349216a40086ca6061efefb5a3025James Dong        return 1;
17802f5b5447de349216a40086ca6061efefb5a3025James Dong    }
17902f5b5447de349216a40086ca6061efefb5a3025James Dong}
18002f5b5447de349216a40086ca6061efefb5a3025James Dong
18102f5b5447de349216a40086ca6061efefb5a3025James Dong/**************************************************************************/
18202f5b5447de349216a40086ca6061efefb5a3025James Dongint GetPredAdvancedBy0x1(
18302f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *prev,        /* i */
18402f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pred_block,      /* i */
18502f5b5447de349216a40086ca6061efefb5a3025James Dong    int width,      /* i */
18602f5b5447de349216a40086ca6061efefb5a3025James Dong    int pred_width_rnd /* i */
18702f5b5447de349216a40086ca6061efefb5a3025James Dong)
18802f5b5447de349216a40086ca6061efefb5a3025James Dong{
18902f5b5447de349216a40086ca6061efefb5a3025James Dong    uint    i;      /* loop variable */
19002f5b5447de349216a40086ca6061efefb5a3025James Dong    int offset, offset2;
19102f5b5447de349216a40086ca6061efefb5a3025James Dong    uint32 word1, word2, word3, word12;
19202f5b5447de349216a40086ca6061efefb5a3025James Dong    int tmp;
19302f5b5447de349216a40086ca6061efefb5a3025James Dong    int rnd1;
19402f5b5447de349216a40086ca6061efefb5a3025James Dong    uint32 mask;
19502f5b5447de349216a40086ca6061efefb5a3025James Dong
19602f5b5447de349216a40086ca6061efefb5a3025James Dong    /* initialize offset to adjust pixel counter */
19702f5b5447de349216a40086ca6061efefb5a3025James Dong    /*    the next row; full-pel resolution      */
19802f5b5447de349216a40086ca6061efefb5a3025James Dong    offset = width - B_SIZE; /* offset for prev */
19902f5b5447de349216a40086ca6061efefb5a3025James Dong    offset2 = (pred_width_rnd >> 1) - 4; /* offset of pred_block */
20002f5b5447de349216a40086ca6061efefb5a3025James Dong
20102f5b5447de349216a40086ca6061efefb5a3025James Dong    rnd1 = pred_width_rnd & 1;
20202f5b5447de349216a40086ca6061efefb5a3025James Dong
20302f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Branch based on pixel location (half-pel or full-pel) for x and y */
20402f5b5447de349216a40086ca6061efefb5a3025James Dong    pred_block -= offset2; /* preset */
20502f5b5447de349216a40086ca6061efefb5a3025James Dong
20602f5b5447de349216a40086ca6061efefb5a3025James Dong    tmp = (uint32)prev & 3;
20702f5b5447de349216a40086ca6061efefb5a3025James Dong    mask = 254;
20802f5b5447de349216a40086ca6061efefb5a3025James Dong    mask |= (mask << 8);
20902f5b5447de349216a40086ca6061efefb5a3025James Dong    mask |= (mask << 16); /* 0xFEFEFEFE */
21002f5b5447de349216a40086ca6061efefb5a3025James Dong
21102f5b5447de349216a40086ca6061efefb5a3025James Dong    if (tmp == 0) /* word-aligned */
21202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
21302f5b5447de349216a40086ca6061efefb5a3025James Dong        if (rnd1 == 1)
21402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
21502f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
21602f5b5447de349216a40086ca6061efefb5a3025James Dong            {
21702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)prev); /* b4 b3 b2 b1 */
21802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev += 4)); /* b8 b7 b6 b5 */
21902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word1 >> 8); /* 0 b4 b3 b2 */
22002f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word2 << 24); /* b5 b4 b3 b2 */
22102f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12
22202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
22302f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
22402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
22502f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
22602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word12 >> 1);
22702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
22802f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */
22902f5b5447de349216a40086ca6061efefb5a3025James Dong
23002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */
23102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word2 >> 8); /* 0 b8 b7 b6 */
23202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word1 << 24); /* b9 b8 b7 b6 */
23302f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word2 | word12;
23402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
23502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask);  /* 0x1010101, check last bit */
23602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
23702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 1;
23802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 + (word12 >> 1);
23902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 += word3;
24002f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */
24102f5b5447de349216a40086ca6061efefb5a3025James Dong
24202f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
24302f5b5447de349216a40086ca6061efefb5a3025James Dong            }
24402f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
24502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
24602f5b5447de349216a40086ca6061efefb5a3025James Dong        else /* rnd1 == 0 */
24702f5b5447de349216a40086ca6061efefb5a3025James Dong        {
24802f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
24902f5b5447de349216a40086ca6061efefb5a3025James Dong            {
25002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)prev); /* b4 b3 b2 b1 */
25102f5b5447de349216a40086ca6061efefb5a3025James Dong
25202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev += 4)); /* b8 b7 b6 b5 */
25302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word1 >> 8); /* 0 b4 b3 b2 */
25402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word2 << 24); /* b5 b4 b3 b2 */
25502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12
25602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
25702f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
25802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
25902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
26002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word12 >> 1);
26102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
26202f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */
26302f5b5447de349216a40086ca6061efefb5a3025James Dong
26402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */
26502f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word2 >> 8); /* 0 b8 b7 b6 */
26602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word1 << 24); /* b9 b8 b7 b6 */
26702f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word2 & word12;
26802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
26902f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask);  /* 0x1010101, check last bit */
27002f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
27102f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 1;
27202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 + (word12 >> 1);
27302f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 += word3;
27402f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */
27502f5b5447de349216a40086ca6061efefb5a3025James Dong
27602f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
27702f5b5447de349216a40086ca6061efefb5a3025James Dong            }
27802f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
27902f5b5447de349216a40086ca6061efefb5a3025James Dong        } /* rnd1 */
28002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
28102f5b5447de349216a40086ca6061efefb5a3025James Dong    else if (tmp == 1)
28202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
28302f5b5447de349216a40086ca6061efefb5a3025James Dong        prev--; /* word-aligned */
28402f5b5447de349216a40086ca6061efefb5a3025James Dong        if (rnd1 == 1)
28502f5b5447de349216a40086ca6061efefb5a3025James Dong        {
28602f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
28702f5b5447de349216a40086ca6061efefb5a3025James Dong            {
28802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)prev); /* b3 b2 b1 b0 */
28902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev += 4)); /* b7 b6 b5 b4 */
29002f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word1 >> 8); /* 0 b3 b2 b1 */
29102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 16; /* 0 0 b3 b2 */
29202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word2 << 24); /* b4 b3 b2 b1 */
29302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 |= (word2 << 16); /* b5 b4 b3 b2 */
29402f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12
29502f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
29602f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
29702f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
29802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
29902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word12 >> 1);
30002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
30102f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */
30202f5b5447de349216a40086ca6061efefb5a3025James Dong
30302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* b11 b10 b9 b8 */
30402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word2 >> 8); /* 0 b7 b6 b5 */
30502f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 16; /* 0 0 b7 b6 */
30602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word1 << 24); /* b8 b7 b6 b5 */
30702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 |= (word1 << 16); /* b9 b8 b7 b6 */
30802f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word2&word12
30902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
31002f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
31102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
31202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 1;
31302f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 + (word12 >> 1);
31402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 += word3;
31502f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */
31602f5b5447de349216a40086ca6061efefb5a3025James Dong
31702f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
31802f5b5447de349216a40086ca6061efefb5a3025James Dong            }
31902f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
32002f5b5447de349216a40086ca6061efefb5a3025James Dong        }
32102f5b5447de349216a40086ca6061efefb5a3025James Dong        else /* rnd1 = 0 */
32202f5b5447de349216a40086ca6061efefb5a3025James Dong        {
32302f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
32402f5b5447de349216a40086ca6061efefb5a3025James Dong            {
32502f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)prev); /* b3 b2 b1 b0 */
32602f5b5447de349216a40086ca6061efefb5a3025James Dong
32702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev += 4)); /* b7 b6 b5 b4 */
32802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word1 >> 8); /* 0 b3 b2 b1 */
32902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 16; /* 0 0 b3 b2 */
33002f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word2 << 24); /* b4 b3 b2 b1 */
33102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 |= (word2 << 16); /* b5 b4 b3 b2 */
33202f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word12;
33302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
33402f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
33502f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
33602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
33702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word12 >> 1);
33802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
33902f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */
34002f5b5447de349216a40086ca6061efefb5a3025James Dong
34102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* b11 b10 b9 b8 */
34202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word2 >> 8); /* 0 b7 b6 b5 */
34302f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 16; /* 0 0 b7 b6 */
34402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word1 << 24); /* b8 b7 b6 b5 */
34502f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 |= (word1 << 16); /* b9 b8 b7 b6 */
34602f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word2 & word12;
34702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
34802f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
34902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
35002f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 1;
35102f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 + (word12 >> 1);
35202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 += word3;
35302f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */
35402f5b5447de349216a40086ca6061efefb5a3025James Dong
35502f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
35602f5b5447de349216a40086ca6061efefb5a3025James Dong            }
35702f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
35802f5b5447de349216a40086ca6061efefb5a3025James Dong        } /* rnd1 */
35902f5b5447de349216a40086ca6061efefb5a3025James Dong    }
36002f5b5447de349216a40086ca6061efefb5a3025James Dong    else if (tmp == 2)
36102f5b5447de349216a40086ca6061efefb5a3025James Dong    {
36202f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 2; /* word-aligned */
36302f5b5447de349216a40086ca6061efefb5a3025James Dong        if (rnd1 == 1)
36402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
36502f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
36602f5b5447de349216a40086ca6061efefb5a3025James Dong            {
36702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)prev); /* b2 b1 b0 bN1 */
36802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev += 4)); /* b6 b5 b4 b3 */
36902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word1 >> 16); /* 0 0 b2 b1 */
37002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 24; /* 0 0 0 b2 */
37102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word2 << 16); /* b4 b3 b2 b1 */
37202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 |= (word2 << 8); /* b5 b4 b3 b2 */
37302f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12
37402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
37502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
37602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
37702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
37802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word12 >> 1);
37902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
38002f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */
38102f5b5447de349216a40086ca6061efefb5a3025James Dong
38202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* b10 b9 b8 b7 */
38302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word2 >> 16); /* 0 0 b6 b5 */
38402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 24; /* 0 0 0 b6 */
38502f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word1 << 16); /* b8 b7 b6 b5 */
38602f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 |= (word1 << 8); /* b9 b8 b7 b6 */
38702f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word1&word12
38802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
38902f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
39002f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
39102f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 1;
39202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 + (word12 >> 1);
39302f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 += word3;
39402f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */
39502f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
39602f5b5447de349216a40086ca6061efefb5a3025James Dong            }
39702f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
39802f5b5447de349216a40086ca6061efefb5a3025James Dong        }
39902f5b5447de349216a40086ca6061efefb5a3025James Dong        else /* rnd1 == 0 */
40002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
40102f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
40202f5b5447de349216a40086ca6061efefb5a3025James Dong            {
40302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)prev); /* b2 b1 b0 bN1 */
40402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev += 4)); /* b6 b5 b4 b3 */
40502f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word1 >> 16); /* 0 0 b2 b1 */
40602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 24; /* 0 0 0 b2 */
40702f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word2 << 16); /* b4 b3 b2 b1 */
40802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 |= (word2 << 8); /* b5 b4 b3 b2 */
40902f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12
41002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
41102f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
41202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
41302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
41402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word12 >> 1);
41502f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
41602f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */
41702f5b5447de349216a40086ca6061efefb5a3025James Dong
41802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* b10 b9 b8 b7 */
41902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word2 >> 16); /* 0 0 b6 b5 */
42002f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 24; /* 0 0 0 b6 */
42102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word1 << 16); /* b8 b7 b6 b5 */
42202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 |= (word1 << 8); /* b9 b8 b7 b6 */
42302f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word2 & word12; // rnd1 = 1; otherwise word3 = word1&word12
42402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
42502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
42602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
42702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 1;
42802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 + (word12 >> 1);
42902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 += word3;
43002f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */
43102f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
43202f5b5447de349216a40086ca6061efefb5a3025James Dong            }
43302f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
43402f5b5447de349216a40086ca6061efefb5a3025James Dong        }
43502f5b5447de349216a40086ca6061efefb5a3025James Dong    }
43602f5b5447de349216a40086ca6061efefb5a3025James Dong    else /* tmp = 3 */
43702f5b5447de349216a40086ca6061efefb5a3025James Dong    {
43802f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 3; /* word-aligned */
43902f5b5447de349216a40086ca6061efefb5a3025James Dong        if (rnd1 == 1)
44002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
44102f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
44202f5b5447de349216a40086ca6061efefb5a3025James Dong            {
44302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)prev); /* b1 b0 bN1 bN2 */
44402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev += 4)); /* b5 b4 b3 b2 */
44502f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word1 >> 24); /* 0 0 0 b1 */
44602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word2 << 8); /* b4 b3 b2 b1 */
44702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word2;
44802f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12
44902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
45002f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
45102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
45202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
45302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word12 >> 1);
45402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
45502f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */
45602f5b5447de349216a40086ca6061efefb5a3025James Dong
45702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* b9 b8 b7 b6 */
45802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word2 >> 24); /* 0 0 0 b5 */
45902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word1 << 8); /* b8 b7 b6 b5 */
46002f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word1; /* b9 b8 b7 b6 */
46102f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word1&word12
46202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
46302f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
46402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
46502f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 1;
46602f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 + (word12 >> 1);
46702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 += word3;
46802f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */
46902f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
47002f5b5447de349216a40086ca6061efefb5a3025James Dong            }
47102f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
47202f5b5447de349216a40086ca6061efefb5a3025James Dong        }
47302f5b5447de349216a40086ca6061efefb5a3025James Dong        else
47402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
47502f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
47602f5b5447de349216a40086ca6061efefb5a3025James Dong            {
47702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)prev); /* b1 b0 bN1 bN2 */
47802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev += 4)); /* b5 b4 b3 b2 */
47902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word1 >> 24); /* 0 0 0 b1 */
48002f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word2 << 8); /* b4 b3 b2 b1 */
48102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word2;
48202f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12
48302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
48402f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
48502f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
48602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
48702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word12 >> 1);
48802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
48902f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */
49002f5b5447de349216a40086ca6061efefb5a3025James Dong
49102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* b9 b8 b7 b6 */
49202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = (word2 >> 24); /* 0 0 0 b5 */
49302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 |= (word1 << 8); /* b8 b7 b6 b5 */
49402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word1; /* b9 b8 b7 b6 */
49502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word2 & word12; // rnd1 = 1; otherwise word3 = word1&word12
49602f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
49702f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
49802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
49902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 1;
50002f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 + (word12 >> 1);
50102f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 += word3;
50202f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */
50302f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
50402f5b5447de349216a40086ca6061efefb5a3025James Dong            }
50502f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
50602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
50702f5b5447de349216a40086ca6061efefb5a3025James Dong    }
50802f5b5447de349216a40086ca6061efefb5a3025James Dong}
50902f5b5447de349216a40086ca6061efefb5a3025James Dong
51002f5b5447de349216a40086ca6061efefb5a3025James Dong/**************************************************************************/
51102f5b5447de349216a40086ca6061efefb5a3025James Dongint GetPredAdvancedBy1x0(
51202f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *prev,        /* i */
51302f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pred_block,      /* i */
51402f5b5447de349216a40086ca6061efefb5a3025James Dong    int width,      /* i */
51502f5b5447de349216a40086ca6061efefb5a3025James Dong    int pred_width_rnd /* i */
51602f5b5447de349216a40086ca6061efefb5a3025James Dong)
51702f5b5447de349216a40086ca6061efefb5a3025James Dong{
51802f5b5447de349216a40086ca6061efefb5a3025James Dong    uint    i;      /* loop variable */
51902f5b5447de349216a40086ca6061efefb5a3025James Dong    int offset, offset2;
52002f5b5447de349216a40086ca6061efefb5a3025James Dong    uint32  word1, word2, word3, word12, word22;
52102f5b5447de349216a40086ca6061efefb5a3025James Dong    int tmp;
52202f5b5447de349216a40086ca6061efefb5a3025James Dong    int rnd1;
52302f5b5447de349216a40086ca6061efefb5a3025James Dong    uint32 mask;
52402f5b5447de349216a40086ca6061efefb5a3025James Dong
52502f5b5447de349216a40086ca6061efefb5a3025James Dong    /* initialize offset to adjust pixel counter */
52602f5b5447de349216a40086ca6061efefb5a3025James Dong    /*    the next row; full-pel resolution      */
52702f5b5447de349216a40086ca6061efefb5a3025James Dong    offset = width - B_SIZE; /* offset for prev */
52802f5b5447de349216a40086ca6061efefb5a3025James Dong    offset2 = (pred_width_rnd >> 1) - 4; /* offset for pred_block */
52902f5b5447de349216a40086ca6061efefb5a3025James Dong
53002f5b5447de349216a40086ca6061efefb5a3025James Dong    rnd1 = pred_width_rnd & 1;
53102f5b5447de349216a40086ca6061efefb5a3025James Dong
53202f5b5447de349216a40086ca6061efefb5a3025James Dong    /* Branch based on pixel location (half-pel or full-pel) for x and y */
53302f5b5447de349216a40086ca6061efefb5a3025James Dong    pred_block -= offset2; /* preset */
53402f5b5447de349216a40086ca6061efefb5a3025James Dong
53502f5b5447de349216a40086ca6061efefb5a3025James Dong    tmp = (uint32)prev & 3;
53602f5b5447de349216a40086ca6061efefb5a3025James Dong    mask = 254;
53702f5b5447de349216a40086ca6061efefb5a3025James Dong    mask |= (mask << 8);
53802f5b5447de349216a40086ca6061efefb5a3025James Dong    mask |= (mask << 16); /* 0xFEFEFEFE */
53902f5b5447de349216a40086ca6061efefb5a3025James Dong
54002f5b5447de349216a40086ca6061efefb5a3025James Dong    if (tmp == 0) /* word-aligned */
54102f5b5447de349216a40086ca6061efefb5a3025James Dong    {
54202f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 4;
54302f5b5447de349216a40086ca6061efefb5a3025James Dong        if (rnd1 == 1)
54402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
54502f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
54602f5b5447de349216a40086ca6061efefb5a3025James Dong            {
54702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4));
54802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
54902f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word2; // rnd1 = 1; otherwise word3 = word1&word2
55002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
55102f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
55202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
55302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
55402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
55502f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
55602f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1;
55702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4));
55802f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
55902f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word2; // rnd1 = 1; otherwise word3 = word1&word2
56002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
56102f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
56202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
56302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
56402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
56502f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
56602f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word1;
56702f5b5447de349216a40086ca6061efefb5a3025James Dong
56802f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
56902f5b5447de349216a40086ca6061efefb5a3025James Dong            }
57002f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
57102f5b5447de349216a40086ca6061efefb5a3025James Dong        }
57202f5b5447de349216a40086ca6061efefb5a3025James Dong        else   /* rnd1 = 0 */
57302f5b5447de349216a40086ca6061efefb5a3025James Dong        {
57402f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
57502f5b5447de349216a40086ca6061efefb5a3025James Dong            {
57602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4));
57702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
57802f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word2;  /* rnd1 = 0; */
57902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
58002f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
58102f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
58202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
58302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
58402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
58502f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word1;
58602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4));
58702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
58802f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word2;  /* rnd1 = 0; */
58902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
59002f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
59102f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
59202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
59302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
59402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
59502f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word1;
59602f5b5447de349216a40086ca6061efefb5a3025James Dong
59702f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
59802f5b5447de349216a40086ca6061efefb5a3025James Dong            }
59902f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
60002f5b5447de349216a40086ca6061efefb5a3025James Dong        }
60102f5b5447de349216a40086ca6061efefb5a3025James Dong    }
60202f5b5447de349216a40086ca6061efefb5a3025James Dong    else if (tmp == 1)
60302f5b5447de349216a40086ca6061efefb5a3025James Dong    {
60402f5b5447de349216a40086ca6061efefb5a3025James Dong        prev--; /* word-aligned */
60502f5b5447de349216a40086ca6061efefb5a3025James Dong        if (rnd1 == 1)
60602f5b5447de349216a40086ca6061efefb5a3025James Dong        {
60702f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
60802f5b5447de349216a40086ca6061efefb5a3025James Dong            {
60902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */
61002f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
61102f5b5447de349216a40086ca6061efefb5a3025James Dong
61202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */
61302f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
61402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 8; /* 0 b4 b3 b2 */
61502f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 >>= 8;
61602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 | (word1 << 24); /* b5 b4 b3 b2 */
61702f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = word22 | (word2 << 24);
61802f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word12 | word22;
61902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
62002f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 &= mask;
62102f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
62202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 1;
62302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 + (word22 >> 1);
62402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 += word3;
62502f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word12;
62602f5b5447de349216a40086ca6061efefb5a3025James Dong
62702f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */
62802f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
62902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 8; /* 0 b8 b7 b6 */
63002f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 8;
63102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 | (word12 << 24); /* b9 b8 b7 b6 */
63202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 | (word22 << 24);
63302f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word2;
63402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
63502f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
63602f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
63702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
63802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
63902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
64002f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word1;
64102f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
64202f5b5447de349216a40086ca6061efefb5a3025James Dong            }
64302f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
64402f5b5447de349216a40086ca6061efefb5a3025James Dong        }
64502f5b5447de349216a40086ca6061efefb5a3025James Dong        else /* rnd1 = 0 */
64602f5b5447de349216a40086ca6061efefb5a3025James Dong        {
64702f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
64802f5b5447de349216a40086ca6061efefb5a3025James Dong            {
64902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */
65002f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
65102f5b5447de349216a40086ca6061efefb5a3025James Dong
65202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */
65302f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
65402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 8; /* 0 b4 b3 b2 */
65502f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 >>= 8;
65602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 | (word1 << 24); /* b5 b4 b3 b2 */
65702f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = word22 | (word2 << 24);
65802f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word12 & word22;
65902f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
66002f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 &= mask;
66102f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
66202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 1;
66302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 + (word22 >> 1);
66402f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 += word3;
66502f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word12;
66602f5b5447de349216a40086ca6061efefb5a3025James Dong
66702f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */
66802f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
66902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 8; /* 0 b8 b7 b6 */
67002f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 8;
67102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 | (word12 << 24); /* b9 b8 b7 b6 */
67202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 | (word22 << 24);
67302f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word2;
67402f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
67502f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
67602f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
67702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
67802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
67902f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
68002f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word1;
68102f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
68202f5b5447de349216a40086ca6061efefb5a3025James Dong            }
68302f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
68402f5b5447de349216a40086ca6061efefb5a3025James Dong        }
68502f5b5447de349216a40086ca6061efefb5a3025James Dong    }
68602f5b5447de349216a40086ca6061efefb5a3025James Dong    else if (tmp == 2)
68702f5b5447de349216a40086ca6061efefb5a3025James Dong    {
68802f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 2; /* word-aligned */
68902f5b5447de349216a40086ca6061efefb5a3025James Dong        if (rnd1 == 1)
69002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
69102f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
69202f5b5447de349216a40086ca6061efefb5a3025James Dong            {
69302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */
69402f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
69502f5b5447de349216a40086ca6061efefb5a3025James Dong
69602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */
69702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
69802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 16; /* 0 0 b4 b3 */
69902f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 >>= 16;
70002f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 | (word1 << 16); /* b6 b5 b4 b3 */
70102f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = word22 | (word2 << 16);
70202f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word12 | word22;
70302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
70402f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 &= mask;
70502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
70602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 1;
70702f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 + (word22 >> 1);
70802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 += word3;
70902f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word12;
71002f5b5447de349216a40086ca6061efefb5a3025James Dong
71102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */
71202f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
71302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 16; /* 0 0 b8 b7 */
71402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 16;
71502f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 | (word12 << 16); /* b10 b9 b8 b7 */
71602f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 | (word22 << 16);
71702f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word2;
71802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
71902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
72002f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
72102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
72202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
72302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
72402f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word1;
72502f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
72602f5b5447de349216a40086ca6061efefb5a3025James Dong            }
72702f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
72802f5b5447de349216a40086ca6061efefb5a3025James Dong        }
72902f5b5447de349216a40086ca6061efefb5a3025James Dong        else /* rnd1 = 0 */
73002f5b5447de349216a40086ca6061efefb5a3025James Dong        {
73102f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
73202f5b5447de349216a40086ca6061efefb5a3025James Dong            {
73302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */
73402f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
73502f5b5447de349216a40086ca6061efefb5a3025James Dong
73602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */
73702f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
73802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 16; /* 0 0 b4 b3 */
73902f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 >>= 16;
74002f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 | (word1 << 16); /* b6 b5 b4 b3 */
74102f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = word22 | (word2 << 16);
74202f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word12 & word22;
74302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
74402f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 &= mask;
74502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
74602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 1;
74702f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 + (word22 >> 1);
74802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 += word3;
74902f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word12;
75002f5b5447de349216a40086ca6061efefb5a3025James Dong
75102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */
75202f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
75302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 16; /* 0 0 b8 b7 */
75402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 16;
75502f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 | (word12 << 16); /* b10 b9 b8 b7 */
75602f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 | (word22 << 16);
75702f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word2;
75802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
75902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
76002f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
76102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
76202f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
76302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
76402f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word1;
76502f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
76602f5b5447de349216a40086ca6061efefb5a3025James Dong            }
76702f5b5447de349216a40086ca6061efefb5a3025James Dong
76802f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
76902f5b5447de349216a40086ca6061efefb5a3025James Dong        }
77002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
77102f5b5447de349216a40086ca6061efefb5a3025James Dong    else /* tmp == 3 */
77202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
77302f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 3; /* word-aligned */
77402f5b5447de349216a40086ca6061efefb5a3025James Dong        if (rnd1 == 1)
77502f5b5447de349216a40086ca6061efefb5a3025James Dong        {
77602f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
77702f5b5447de349216a40086ca6061efefb5a3025James Dong            {
77802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */
77902f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
78002f5b5447de349216a40086ca6061efefb5a3025James Dong
78102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */
78202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
78302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 24; /* 0 0 0 b4 */
78402f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 >>= 24;
78502f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 | (word1 << 8); /* b7 b6 b5 b4 */
78602f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = word22 | (word2 << 8);
78702f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word12 | word22;
78802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
78902f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 &= mask;
79002f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
79102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 1;
79202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 + (word22 >> 1);
79302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 += word3;
79402f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word12;
79502f5b5447de349216a40086ca6061efefb5a3025James Dong
79602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */
79702f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
79802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 24; /* 0 0 0 b8 */
79902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 24;
80002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 | (word12 << 8); /* b11 b10 b9 b8 */
80102f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 | (word22 << 8);
80202f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 | word2;
80302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
80402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
80502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
80602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
80702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
80802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
80902f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word1;
81002f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
81102f5b5447de349216a40086ca6061efefb5a3025James Dong            }
81202f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
81302f5b5447de349216a40086ca6061efefb5a3025James Dong        }
81402f5b5447de349216a40086ca6061efefb5a3025James Dong        else /* rnd1 = 0 */
81502f5b5447de349216a40086ca6061efefb5a3025James Dong        {
81602f5b5447de349216a40086ca6061efefb5a3025James Dong            for (i = B_SIZE; i > 0; i--)
81702f5b5447de349216a40086ca6061efefb5a3025James Dong            {
81802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */
81902f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
82002f5b5447de349216a40086ca6061efefb5a3025James Dong
82102f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */
82202f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = *((uint32*)(prev + width));
82302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 24; /* 0 0 0 b4 */
82402f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 >>= 24;
82502f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 | (word1 << 8); /* b7 b6 b5 b4 */
82602f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = word22 | (word2 << 8);
82702f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word12 & word22;
82802f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 &= mask;
82902f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 &= mask;
83002f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
83102f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 >>= 1;
83202f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = word12 + (word22 >> 1);
83302f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 += word3;
83402f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += offset2)) = word12;
83502f5b5447de349216a40086ca6061efefb5a3025James Dong
83602f5b5447de349216a40086ca6061efefb5a3025James Dong                word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */
83702f5b5447de349216a40086ca6061efefb5a3025James Dong                word22 = *((uint32*)(prev + width));
83802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 24; /* 0 0 0 b8 */
83902f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 >>= 24;
84002f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 | (word12 << 8); /* b11 b10 b9 b8 */
84102f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 = word2 | (word22 << 8);
84202f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 = word1 & word2;
84302f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 &= mask;
84402f5b5447de349216a40086ca6061efefb5a3025James Dong                word2 &= mask;
84502f5b5447de349216a40086ca6061efefb5a3025James Dong                word3 &= (~mask); /* 0x1010101, check last bit */
84602f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 >>= 1;
84702f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 = word1 + (word2 >> 1);
84802f5b5447de349216a40086ca6061efefb5a3025James Dong                word1 += word3;
84902f5b5447de349216a40086ca6061efefb5a3025James Dong                *((uint32*)(pred_block += 4)) = word1;
85002f5b5447de349216a40086ca6061efefb5a3025James Dong                prev += offset;
85102f5b5447de349216a40086ca6061efefb5a3025James Dong            }
85202f5b5447de349216a40086ca6061efefb5a3025James Dong            return 1;
85302f5b5447de349216a40086ca6061efefb5a3025James Dong        } /* rnd */
85402f5b5447de349216a40086ca6061efefb5a3025James Dong    } /* tmp */
85502f5b5447de349216a40086ca6061efefb5a3025James Dong}
85602f5b5447de349216a40086ca6061efefb5a3025James Dong
85702f5b5447de349216a40086ca6061efefb5a3025James Dong/**********************************************************************************/
85802f5b5447de349216a40086ca6061efefb5a3025James Dongint GetPredAdvancedBy1x1(
85902f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *prev,        /* i */
86002f5b5447de349216a40086ca6061efefb5a3025James Dong    uint8 *pred_block,      /* i */
86102f5b5447de349216a40086ca6061efefb5a3025James Dong    int width,      /* i */
86202f5b5447de349216a40086ca6061efefb5a3025James Dong    int pred_width_rnd /* i */
86302f5b5447de349216a40086ca6061efefb5a3025James Dong)
86402f5b5447de349216a40086ca6061efefb5a3025James Dong{
86502f5b5447de349216a40086ca6061efefb5a3025James Dong    uint    i;      /* loop variable */
86602f5b5447de349216a40086ca6061efefb5a3025James Dong    int offset, offset2;
86702f5b5447de349216a40086ca6061efefb5a3025James Dong    uint32  x1, x2, x1m, x2m, y1, y2, y1m, y2m; /* new way */
86802f5b5447de349216a40086ca6061efefb5a3025James Dong    int tmp;
86902f5b5447de349216a40086ca6061efefb5a3025James Dong    int rnd1, rnd2;
87002f5b5447de349216a40086ca6061efefb5a3025James Dong    uint32 mask;
87102f5b5447de349216a40086ca6061efefb5a3025James Dong
87202f5b5447de349216a40086ca6061efefb5a3025James Dong    /* initialize offset to adjust pixel counter */
87302f5b5447de349216a40086ca6061efefb5a3025James Dong    /*    the next row; full-pel resolution      */
87402f5b5447de349216a40086ca6061efefb5a3025James Dong    offset = width - B_SIZE; /* offset for prev */
87502f5b5447de349216a40086ca6061efefb5a3025James Dong    offset2 = (pred_width_rnd >> 1) - 8; /* offset for pred_block */
87602f5b5447de349216a40086ca6061efefb5a3025James Dong
87702f5b5447de349216a40086ca6061efefb5a3025James Dong    rnd1 = pred_width_rnd & 1;
87802f5b5447de349216a40086ca6061efefb5a3025James Dong
87902f5b5447de349216a40086ca6061efefb5a3025James Dong    rnd2 = rnd1 + 1;
88002f5b5447de349216a40086ca6061efefb5a3025James Dong    rnd2 |= (rnd2 << 8);
88102f5b5447de349216a40086ca6061efefb5a3025James Dong    rnd2 |= (rnd2 << 16);
88202f5b5447de349216a40086ca6061efefb5a3025James Dong
88302f5b5447de349216a40086ca6061efefb5a3025James Dong    mask = 0x3F;
88402f5b5447de349216a40086ca6061efefb5a3025James Dong    mask |= (mask << 8);
88502f5b5447de349216a40086ca6061efefb5a3025James Dong    mask |= (mask << 16); /* 0x3f3f3f3f */
88602f5b5447de349216a40086ca6061efefb5a3025James Dong
88702f5b5447de349216a40086ca6061efefb5a3025James Dong    tmp = (uint32)prev & 3;
88802f5b5447de349216a40086ca6061efefb5a3025James Dong
88902f5b5447de349216a40086ca6061efefb5a3025James Dong    pred_block -= 4; /* preset */
89002f5b5447de349216a40086ca6061efefb5a3025James Dong
89102f5b5447de349216a40086ca6061efefb5a3025James Dong    if (tmp == 0) /* word-aligned */
89202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
89302f5b5447de349216a40086ca6061efefb5a3025James Dong        for (i = B_SIZE; i > 0; i--)
89402f5b5447de349216a40086ca6061efefb5a3025James Dong        {
89502f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 = *((uint32*)prev); /* load a3 a2 a1 a0 */
89602f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = *((uint32*)(prev + width)); /* load b3 b2 b1 b0, another line */
89702f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 = *((uint32*)(prev += 4)); /* a7 a6 a5 a4 */
89802f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = *((uint32*)(prev + width)); /* b7 b6 b5 b4 */
89902f5b5447de349216a40086ca6061efefb5a3025James Dong
90002f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m = (x1 >> 2) & mask; /* zero out last 2 bits */
90102f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m = (x2 >> 2) & mask;
90202f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 = x1 ^(x1m << 2);
90302f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = x2 ^(x2m << 2);
90402f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += x2m;
90502f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += x2;
90602f5b5447de349216a40086ca6061efefb5a3025James Dong
90702f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m, x2 free */
90802f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m = (y1 >> 2) & mask; /* zero out last 2 bits */
90902f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y2 >> 2) & mask;
91002f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 = y1 ^(y1m << 2);
91102f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y2 ^(y2m << 2);
91202f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += y2m;
91302f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += y2;
91402f5b5447de349216a40086ca6061efefb5a3025James Dong
91502f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y2m, y2 free */
91602f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m, x2 free */
91702f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = *((uint32*)(prev += 4)); /* a11 a10 a9 a8 */
91802f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = *((uint32*)(prev + width)); /* b11 b10 b9 b8 */
91902f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m = (x2 >> 2) & mask;
92002f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y2 >> 2) & mask;
92102f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = x2 ^(x2m << 2);
92202f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y2 ^(y2m << 2);
92302f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m += y2m;
92402f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 += y2;
92502f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y2m, y2 free */
92602f5b5447de349216a40086ca6061efefb5a3025James Dong
92702f5b5447de349216a40086ca6061efefb5a3025James Dong            /* now operate on x1m, x1, y1m, y1, x2m, x2 */
92802f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */
92902f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */
93002f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */
93102f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x1, y1, x2 */
93202f5b5447de349216a40086ca6061efefb5a3025James Dong
93302f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = x1m >> 8;
93402f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = x1 >> 8;
93502f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m |= (y1m << 24);  /* a4+b4, a3+b3, a2+b2, a1+b1 */
93602f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 |= (y1 << 24);
93702f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += y2m;  /* a3+b3+a4+b4, ....., a0+b0+a1+b1 */
93802f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += y2;
93902f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += rnd2;
94002f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 &= (mask << 2);
94102f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += (x1 >> 2);
94202f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = x1m; /* save x1m */
94302f5b5447de349216a40086ca6061efefb5a3025James Dong
94402f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = y1m >> 8;
94502f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y1 >> 8;
94602f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m |= (x2m << 24); /* a8+b8, a7+b7, a6+b6, a5+b5 */
94702f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 |= (x2 << 24);
94802f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += y2m;  /* a7+b7+a8+b8, ....., a4+b4+a5+b5 */
94902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += y2;
95002f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += rnd2;
95102f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 &= (mask << 2);
95202f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += (y1 >> 2);
95302f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = y1m; /* save y1m */
95402f5b5447de349216a40086ca6061efefb5a3025James Dong
95502f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_block += offset2;
95602f5b5447de349216a40086ca6061efefb5a3025James Dong            prev += offset;
95702f5b5447de349216a40086ca6061efefb5a3025James Dong        }
95802f5b5447de349216a40086ca6061efefb5a3025James Dong
95902f5b5447de349216a40086ca6061efefb5a3025James Dong        return 1;
96002f5b5447de349216a40086ca6061efefb5a3025James Dong    }
96102f5b5447de349216a40086ca6061efefb5a3025James Dong    else if (tmp == 1)
96202f5b5447de349216a40086ca6061efefb5a3025James Dong    {
96302f5b5447de349216a40086ca6061efefb5a3025James Dong        prev--; /* to word-aligned */
96402f5b5447de349216a40086ca6061efefb5a3025James Dong        for (i = B_SIZE; i > 0; i--)
96502f5b5447de349216a40086ca6061efefb5a3025James Dong        {
96602f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 = *((uint32*)prev); /* load a3 a2 a1 a0 */
96702f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = *((uint32*)(prev + width)); /* load b3 b2 b1 b0, another line */
96802f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 = *((uint32*)(prev += 4)); /* a7 a6 a5 a4 */
96902f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = *((uint32*)(prev + width)); /* b7 b6 b5 b4 */
97002f5b5447de349216a40086ca6061efefb5a3025James Dong
97102f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m = (x1 >> 2) & mask; /* zero out last 2 bits */
97202f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m = (x2 >> 2) & mask;
97302f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 = x1 ^(x1m << 2);
97402f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = x2 ^(x2m << 2);
97502f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += x2m;
97602f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += x2;
97702f5b5447de349216a40086ca6061efefb5a3025James Dong
97802f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m, x2 free */
97902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m = (y1 >> 2) & mask; /* zero out last 2 bits */
98002f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y2 >> 2) & mask;
98102f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 = y1 ^(y1m << 2);
98202f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y2 ^(y2m << 2);
98302f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += y2m;
98402f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += y2;
98502f5b5447de349216a40086ca6061efefb5a3025James Dong
98602f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y2m, y2 free */
98702f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m, x2 free */
98802f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = *((uint32*)(prev += 4)); /* a11 a10 a9 a8 */
98902f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = *((uint32*)(prev + width)); /* b11 b10 b9 b8 */
99002f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m = (x2 >> 2) & mask;
99102f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y2 >> 2) & mask;
99202f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = x2 ^(x2m << 2);
99302f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y2 ^(y2m << 2);
99402f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m += y2m;
99502f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 += y2;
99602f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y2m, y2 free */
99702f5b5447de349216a40086ca6061efefb5a3025James Dong
99802f5b5447de349216a40086ca6061efefb5a3025James Dong            /* now operate on x1m, x1, y1m, y1, x2m, x2 */
99902f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */
100002f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */
100102f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */
100202f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x1, y1, x2 */
100302f5b5447de349216a40086ca6061efefb5a3025James Dong
100402f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m >>= 8 ;
100502f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 >>= 8;
100602f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m |= (y1m << 24);  /* a4+b4, a3+b3, a2+b2, a1+b1 */
100702f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 |= (y1 << 24);
100802f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y1m << 16);
100902f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = (y1 << 16);
101002f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m |= (x1m >> 8); /* a5+b5, a4+b4, a3+b3, a2+b2 */
101102f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 |= (x1 >> 8);
101202f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += rnd2;
101302f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += y2m;  /* a4+b4+a5+b5, ....., a1+b1+a2+b2 */
101402f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += y2;
101502f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 &= (mask << 2);
101602f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += (x1 >> 2);
101702f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = x1m; /* save x1m */
101802f5b5447de349216a40086ca6061efefb5a3025James Dong
101902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m >>= 8;
102002f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 >>= 8;
102102f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m |= (x2m << 24); /* a8+b8, a7+b7, a6+b6, a5+b5 */
102202f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 |= (x2 << 24);
102302f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (x2m << 16);
102402f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = (x2 << 16);
102502f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m |= (y1m >> 8); /*  a9+b9, a8+b8, a7+b7, a6+b6,*/
102602f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 |= (y1 >> 8);
102702f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += rnd2;
102802f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += y2m;  /* a8+b8+a9+b9, ....., a5+b5+a6+b6 */
102902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += y2;
103002f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 &= (mask << 2);
103102f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += (y1 >> 2);
103202f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = y1m; /* save y1m */
103302f5b5447de349216a40086ca6061efefb5a3025James Dong
103402f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_block += offset2;
103502f5b5447de349216a40086ca6061efefb5a3025James Dong            prev += offset;
103602f5b5447de349216a40086ca6061efefb5a3025James Dong        }
103702f5b5447de349216a40086ca6061efefb5a3025James Dong        return 1;
103802f5b5447de349216a40086ca6061efefb5a3025James Dong    }
103902f5b5447de349216a40086ca6061efefb5a3025James Dong    else if (tmp == 2)
104002f5b5447de349216a40086ca6061efefb5a3025James Dong    {
104102f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 2; /* to word-aligned */
104202f5b5447de349216a40086ca6061efefb5a3025James Dong        for (i = B_SIZE; i > 0; i--)
104302f5b5447de349216a40086ca6061efefb5a3025James Dong        {
104402f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 = *((uint32*)prev); /* load a3 a2 a1 a0 */
104502f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = *((uint32*)(prev + width)); /* load b3 b2 b1 b0, another line */
104602f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 = *((uint32*)(prev += 4)); /* a7 a6 a5 a4 */
104702f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = *((uint32*)(prev + width)); /* b7 b6 b5 b4 */
104802f5b5447de349216a40086ca6061efefb5a3025James Dong
104902f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m = (x1 >> 2) & mask; /* zero out last 2 bits */
105002f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m = (x2 >> 2) & mask;
105102f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 = x1 ^(x1m << 2);
105202f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = x2 ^(x2m << 2);
105302f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += x2m;
105402f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += x2;
105502f5b5447de349216a40086ca6061efefb5a3025James Dong
105602f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m, x2 free */
105702f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m = (y1 >> 2) & mask; /* zero out last 2 bits */
105802f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y2 >> 2) & mask;
105902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 = y1 ^(y1m << 2);
106002f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y2 ^(y2m << 2);
106102f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += y2m;
106202f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += y2;
106302f5b5447de349216a40086ca6061efefb5a3025James Dong
106402f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y2m, y2 free */
106502f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m, x2 free */
106602f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = *((uint32*)(prev += 4)); /* a11 a10 a9 a8 */
106702f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = *((uint32*)(prev + width)); /* b11 b10 b9 b8 */
106802f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m = (x2 >> 2) & mask;
106902f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y2 >> 2) & mask;
107002f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = x2 ^(x2m << 2);
107102f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y2 ^(y2m << 2);
107202f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m += y2m;
107302f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 += y2;
107402f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y2m, y2 free */
107502f5b5447de349216a40086ca6061efefb5a3025James Dong
107602f5b5447de349216a40086ca6061efefb5a3025James Dong            /* now operate on x1m, x1, y1m, y1, x2m, x2 */
107702f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */
107802f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */
107902f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */
108002f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x1, y1, x2 */
108102f5b5447de349216a40086ca6061efefb5a3025James Dong
108202f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m >>= 16 ;
108302f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 >>= 16;
108402f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m |= (y1m << 16);  /* a5+b5, a4+b4, a3+b3, a2+b2 */
108502f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 |= (y1 << 16);
108602f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y1m << 8);
108702f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = (y1 << 8);
108802f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m |= (x1m >> 8); /* a6+b6, a5+b5, a4+b4, a3+b3 */
108902f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 |= (x1 >> 8);
109002f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += rnd2;
109102f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += y2m;  /* a5+b5+a6+b6, ....., a2+b2+a3+b3 */
109202f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += y2;
109302f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 &= (mask << 2);
109402f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += (x1 >> 2);
109502f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = x1m; /* save x1m */
109602f5b5447de349216a40086ca6061efefb5a3025James Dong
109702f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m >>= 16;
109802f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 >>= 16;
109902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m |= (x2m << 16); /* a9+b9, a8+b8, a7+b7, a6+b6 */
110002f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 |= (x2 << 16);
110102f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (x2m << 8);
110202f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = (x2 << 8);
110302f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m |= (y1m >> 8); /*  a10+b10, a9+b9, a8+b8, a7+b7,*/
110402f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 |= (y1 >> 8);
110502f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += rnd2;
110602f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += y2m;  /* a9+b9+a10+b10, ....., a6+b6+a7+b7 */
110702f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += y2;
110802f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 &= (mask << 2);
110902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += (y1 >> 2);
111002f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = y1m; /* save y1m */
111102f5b5447de349216a40086ca6061efefb5a3025James Dong
111202f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_block += offset2;
111302f5b5447de349216a40086ca6061efefb5a3025James Dong            prev += offset;
111402f5b5447de349216a40086ca6061efefb5a3025James Dong        }
111502f5b5447de349216a40086ca6061efefb5a3025James Dong        return 1;
111602f5b5447de349216a40086ca6061efefb5a3025James Dong    }
111702f5b5447de349216a40086ca6061efefb5a3025James Dong    else /* tmp == 3 */
111802f5b5447de349216a40086ca6061efefb5a3025James Dong    {
111902f5b5447de349216a40086ca6061efefb5a3025James Dong        prev -= 3; /* to word-aligned */
112002f5b5447de349216a40086ca6061efefb5a3025James Dong        for (i = B_SIZE; i > 0; i--)
112102f5b5447de349216a40086ca6061efefb5a3025James Dong        {
112202f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 = *((uint32*)prev); /* load a3 a2 a1 a0 */
112302f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = *((uint32*)(prev + width)); /* load b3 b2 b1 b0, another line */
112402f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 = *((uint32*)(prev += 4)); /* a7 a6 a5 a4 */
112502f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = *((uint32*)(prev + width)); /* b7 b6 b5 b4 */
112602f5b5447de349216a40086ca6061efefb5a3025James Dong
112702f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m = (x1 >> 2) & mask; /* zero out last 2 bits */
112802f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m = (x2 >> 2) & mask;
112902f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 = x1 ^(x1m << 2);
113002f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = x2 ^(x2m << 2);
113102f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += x2m;
113202f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += x2;
113302f5b5447de349216a40086ca6061efefb5a3025James Dong
113402f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m, x2 free */
113502f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m = (y1 >> 2) & mask; /* zero out last 2 bits */
113602f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y2 >> 2) & mask;
113702f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 = y1 ^(y1m << 2);
113802f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y2 ^(y2m << 2);
113902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += y2m;
114002f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += y2;
114102f5b5447de349216a40086ca6061efefb5a3025James Dong
114202f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y2m, y2 free */
114302f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m, x2 free */
114402f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = *((uint32*)(prev += 4)); /* a11 a10 a9 a8 */
114502f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = *((uint32*)(prev + width)); /* b11 b10 b9 b8 */
114602f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m = (x2 >> 2) & mask;
114702f5b5447de349216a40086ca6061efefb5a3025James Dong            y2m = (y2 >> 2) & mask;
114802f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 = x2 ^(x2m << 2);
114902f5b5447de349216a40086ca6061efefb5a3025James Dong            y2 = y2 ^(y2m << 2);
115002f5b5447de349216a40086ca6061efefb5a3025James Dong            x2m += y2m;
115102f5b5447de349216a40086ca6061efefb5a3025James Dong            x2 += y2;
115202f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y2m, y2 free */
115302f5b5447de349216a40086ca6061efefb5a3025James Dong
115402f5b5447de349216a40086ca6061efefb5a3025James Dong            /* now operate on x1m, x1, y1m, y1, x2m, x2 */
115502f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */
115602f5b5447de349216a40086ca6061efefb5a3025James Dong            /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */
115702f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */
115802f5b5447de349216a40086ca6061efefb5a3025James Dong            /* x1, y1, x2 */
115902f5b5447de349216a40086ca6061efefb5a3025James Dong
116002f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m >>= 24 ;
116102f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 >>= 24;
116202f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m |= (y1m << 8);  /* a6+b6, a5+b5, a4+b4, a3+b3 */
116302f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 |= (y1 << 8);
116402f5b5447de349216a40086ca6061efefb5a3025James Dong
116502f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += y1m;  /* a6+b6+a7+b7, ....., a3+b3+a4+b4 */
116602f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += y1;
116702f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 += rnd2;
116802f5b5447de349216a40086ca6061efefb5a3025James Dong            x1 &= (mask << 2);
116902f5b5447de349216a40086ca6061efefb5a3025James Dong            x1m += (x1 >> 2);
117002f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = x1m; /* save x1m */
117102f5b5447de349216a40086ca6061efefb5a3025James Dong
117202f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m >>= 24;
117302f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 >>= 24;
117402f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m |= (x2m << 8); /* a10+b10, a9+b9, a8+b8, a7+b7 */
117502f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 |= (x2 << 8);
117602f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += x2m;  /* a10+b10+a11+b11, ....., a7+b7+a8+b8 */
117702f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += x2;
117802f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 += rnd2;
117902f5b5447de349216a40086ca6061efefb5a3025James Dong            y1 &= (mask << 2);
118002f5b5447de349216a40086ca6061efefb5a3025James Dong            y1m += (y1 >> 2);
118102f5b5447de349216a40086ca6061efefb5a3025James Dong            *((uint32*)(pred_block += 4)) = y1m; /* save y1m */
118202f5b5447de349216a40086ca6061efefb5a3025James Dong
118302f5b5447de349216a40086ca6061efefb5a3025James Dong            pred_block += offset2;
118402f5b5447de349216a40086ca6061efefb5a3025James Dong            prev += offset;
118502f5b5447de349216a40086ca6061efefb5a3025James Dong        }
118602f5b5447de349216a40086ca6061efefb5a3025James Dong        return 1;
118702f5b5447de349216a40086ca6061efefb5a3025James Dong    }
118802f5b5447de349216a40086ca6061efefb5a3025James Dong}
118902f5b5447de349216a40086ca6061efefb5a3025James Dong
119002f5b5447de349216a40086ca6061efefb5a3025James Dong
1191