;*****************************************************************************
;* const-a.asm: x86 global constants
;*****************************************************************************
;* Copyright (C) 2010-2013 x264 project
;*
;* Authors: Loren Merritt <lorenm@u.washington.edu>
;*          Fiona Glaser <fiona@x264.com>
;*          Min Chen <chenm003@163.com> <min.chen@multicorewareinc.com>
;*          Praveen Kumar Tiwari <praveen@multicorewareinc.com>
;* This program is free software; you can redistribute it and/or modify
;* it under the terms of the GNU General Public License as published by
;* the Free Software Foundation; either version 2 of the License, or
;* (at your option) any later version.
;*
;* This program is distributed in the hope that it will be useful,
;* but WITHOUT ANY WARRANTY; without even the implied warranty of
;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;* GNU General Public License for more details.
;*
;* You should have received a copy of the GNU General Public License
;* along with this program; if not, write to the Free Software
;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
;*
;* This program is also available under a commercial proprietary license.
;* For more information, contact us at license @ x265.com.
;*****************************************************************************

%include "x86inc.asm"

SECTION_RODATA 32

;; 8-bit constants

const pb_0,                 times 16 db 0
const pb_1,                 times 32 db 1
const pb_2,                 times 32 db 2
const pb_3,                 times 16 db 3
const pb_4,                 times 32 db 4
const pb_8,                 times 32 db 8
const pb_15,                times 32 db 15
const pb_16,                times 32 db 16
const pb_32,                times 32 db 32
const pb_64,                times 32 db 64
const pb_128,               times 32 db 128
const pb_a1,                times 16 db 0xa1

const pb_01,                times  8 db   0,   1
const hsub_mul,             times 16 db   1,  -1
const pw_swap,              times  2 db   6,   7,   4,   5,   2,   3,   0,   1
const pb_unpackbd1,         times  2 db   0,   0,   0,   0,   1,   1,   1,   1,   2,   2,   2,   2,   3,   3,   3,   3
const pb_unpackbd2,         times  2 db   4,   4,   4,   4,   5,   5,   5,   5,   6,   6,   6,   6,   7,   7,   7,   7
const pb_unpackwq1,         times  1 db   0,   1,   0,   1,   0,   1,   0,   1,   2,   3,   2,   3,   2,   3,   2,   3
const pb_unpackwq2,         times  1 db   4,   5,   4,   5,   4,   5,   4,   5,   6,   7,   6,   7,   6,   7,   6,   7
const pb_shuf8x8c,          times  1 db   0,   0,   0,   0,   2,   2,   2,   2,   4,   4,   4,   4,   6,   6,   6,   6
const pb_movemask,          times 16 db 0x00
                            times 16 db 0xFF

const pb_movemask_32,       times 32 db 0x00
                            times 32 db 0xFF
                            times 32 db 0x00

const pb_0000000000000F0F,  times  2 db 0xff, 0x00
                            times 12 db 0x00
const pb_000000000000000F,           db 0xff
                            times 15 db 0x00

;; 16-bit constants

const pw_1,                 times 16 dw 1
const pw_2,                 times 16 dw 2
const pw_3,                 times 16 dw 3
const pw_7,                 times 16 dw 7
const pw_m2,                times  8 dw -2
const pw_4,                 times  8 dw 4
const pw_8,                 times  8 dw 8
const pw_16,                times 16 dw 16
const pw_15,                times 16 dw 15
const pw_31,                times 16 dw 31
const pw_32,                times 16 dw 32
const pw_64,                times  8 dw 64
const pw_128,               times 16 dw 128
const pw_256,               times 16 dw 256
const pw_257,               times 16 dw 257
const pw_512,               times 16 dw 512
const pw_1023,              times 16 dw 1023
const pw_1024,              times 16 dw 1024
const pw_2048,              times 16 dw 2048
const pw_4096,              times 16 dw 4096
const pw_8192,              times  8 dw 8192
const pw_00ff,              times 16 dw 0x00ff
const pw_ff00,              times  8 dw 0xff00
const pw_2000,              times 16 dw 0x2000
const pw_8000,              times  8 dw 0x8000
const pw_3fff,              times  8 dw 0x3fff
const pw_32_0,              times  4 dw 32,
                            times  4 dw 0
const pw_pixel_max,         times 16 dw ((1 << BIT_DEPTH)-1)

const pw_0_15,              times  2 dw   0,   1,   2,   3,   4,   5,   6,   7
const pw_ppppmmmm,          times  1 dw   1,   1,   1,   1,  -1,  -1,  -1,  -1
const pw_ppmmppmm,          times  1 dw   1,   1,  -1,  -1,   1,   1,  -1,  -1
const pw_pmpmpmpm,          times 16 dw   1,  -1,   1,  -1,   1,  -1,   1,  -1
const pw_pmmpzzzz,          times  1 dw   1,  -1,  -1,   1,   0,   0,   0,   0
const multi_2Row,           times  1 dw   1,   2,   3,   4,   1,   2,   3,   4
const multiH,               times  1 dw   9,  10,  11,  12,  13,  14,  15,  16
const multiH3,              times  1 dw  25,  26,  27,  28,  29,  30,  31,  32
const multiL,               times  1 dw   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,  15,  16
const multiH2,              times  1 dw  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,  30,  31,  32
const pw_planar16_mul,      times  1 dw  15,  14,  13,  12,  11,  10,   9,   8,   7,   6,   5,   4,   3,   2,   1,   0
const pw_planar32_mul,      times  1 dw  31,  30,  29,  28,  27,  26,  25,  24,  23,  22,  21,  20,  19,  18,  17,  16
const pw_FFFFFFFFFFFFFFF0,           dw 0x00
                            times  7 dw 0xff
const hmul_16p,             times 16 db   1
                            times  8 db   1,  -1


;; 32-bit constants

const pd_1,                 times  8 dd 1
const pd_2,                 times  8 dd 2
const pd_4,                 times  4 dd 4
const pd_8,                 times  4 dd 8
const pd_16,                times  8 dd 16
const pd_31,                times  4 dd 31
const pd_32,                times  8 dd 32
const pd_64,                times  4 dd 64
const pd_128,               times  4 dd 128
const pd_256,               times  4 dd 256
const pd_512,               times  4 dd 512
const pd_1024,              times  4 dd 1024
const pd_2048,              times  4 dd 2048
const pd_ffff,              times  4 dd 0xffff
const pd_32767,             times  4 dd 32767
const pd_524416,            times  4 dd 524416
const pd_n32768,            times  8 dd 0xffff8000
const pd_n131072,           times  4 dd 0xfffe0000

const trans8_shuf,          times  1 dd   0,   4,   1,   5,   2,   6,   3,   7

const popcnt_table
%assign x 0
%rep 256
; population count
db ((x>>0)&1)+((x>>1)&1)+((x>>2)&1)+((x>>3)&1)+((x>>4)&1)+((x>>5)&1)+((x>>6)&1)+((x>>7)&1)
%assign x x+1
%endrep
