1 /* 2 * Copyright © 2018, VideoLAN and dav1d authors 3 * Copyright © 2018, Two Orioles, LLC 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright notice, this 10 * list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright notice, 13 * this list of conditions and the following disclaimer in the documentation 14 * and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 20 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28 #ifndef DAV1D_SRC_CTX_H 29 #define DAV1D_SRC_CTX_H 30 31 #include <stdint.h> 32 33 #include "common/attributes.h" 34 35 union alias64 { uint64_t u64; uint8_t u8[8]; } ATTR_ALIAS; 36 union alias32 { uint32_t u32; uint8_t u8[4]; } ATTR_ALIAS; 37 union alias16 { uint16_t u16; uint8_t u8[2]; } ATTR_ALIAS; 38 union alias8 { uint8_t u8; } ATTR_ALIAS; 39 40 #define set_ctx_rep4(type, var, off, val) do { \ 41 const uint64_t const_val = val; \ 42 ((union alias64 *) &var[off + 0])->u64 = const_val; \ 43 ((union alias64 *) &var[off + 8])->u64 = const_val; \ 44 ((union alias64 *) &var[off + 16])->u64 = const_val; \ 45 ((union alias64 *) &var[off + 24])->u64 = const_val; \ 46 } while (0) 47 #define set_ctx_rep2(type, var, off, val) do { \ 48 const uint64_t const_val = val; \ 49 ((union alias64 *) &var[off + 0])->u64 = const_val; \ 50 ((union alias64 *) &var[off + 8])->u64 = const_val; \ 51 } while (0) 52 #define set_ctx_rep1(typesz, var, off, val) \ 53 ((union alias##typesz *) &var[off])->u##typesz = val 54 #define case_set(var, dir, diridx, off) \ 55 switch (var) { \ 56 case 1: set_ctx( 8, dir, diridx, off, 0x01, set_ctx_rep1); break; \ 57 case 2: set_ctx(16, dir, diridx, off, 0x0101, set_ctx_rep1); break; \ 58 case 4: set_ctx(32, dir, diridx, off, 0x01010101U, set_ctx_rep1); break; \ 59 case 8: set_ctx(64, dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep1); break; \ 60 case 16: set_ctx( , dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep2); break; \ 61 case 32: set_ctx( , dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep4); break; \ 62 } 63 #define case_set_upto16(var, dir, diridx, off) \ 64 switch (var) { \ 65 case 1: set_ctx( 8, dir, diridx, off, 0x01, set_ctx_rep1); break; \ 66 case 2: set_ctx(16, dir, diridx, off, 0x0101, set_ctx_rep1); break; \ 67 case 4: set_ctx(32, dir, diridx, off, 0x01010101U, set_ctx_rep1); break; \ 68 case 8: set_ctx(64, dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep1); break; \ 69 case 16: set_ctx( , dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep2); break; \ 70 } 71 #define case_set_upto32_with_default(var, dir, diridx, off) \ 72 switch (var) { \ 73 case 1: set_ctx( 8, dir, diridx, off, 0x01, set_ctx_rep1); break; \ 74 case 2: set_ctx(16, dir, diridx, off, 0x0101, set_ctx_rep1); break; \ 75 case 4: set_ctx(32, dir, diridx, off, 0x01010101U, set_ctx_rep1); break; \ 76 case 8: set_ctx(64, dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep1); break; \ 77 case 16: set_ctx( , dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep2); break; \ 78 case 32: set_ctx( , dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep4); break; \ 79 default: default_memset(dir, diridx, off, var); break; \ 80 } 81 #define case_set_upto16_with_default(var, dir, diridx, off) \ 82 switch (var) { \ 83 case 1: set_ctx( 8, dir, diridx, off, 0x01, set_ctx_rep1); break; \ 84 case 2: set_ctx(16, dir, diridx, off, 0x0101, set_ctx_rep1); break; \ 85 case 4: set_ctx(32, dir, diridx, off, 0x01010101U, set_ctx_rep1); break; \ 86 case 8: set_ctx(64, dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep1); break; \ 87 case 16: set_ctx( , dir, diridx, off, 0x0101010101010101ULL, set_ctx_rep2); break; \ 88 default: default_memset(dir, diridx, off, var); break; \ 89 } 90 91 #endif /* DAV1D_SRC_CTX_H */ 92