1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright 2024 Advanced Micro Devices, Inc. 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 5*61046927SAndroid Build Coastguard Worker */ 6*61046927SAndroid Build Coastguard Worker 7*61046927SAndroid Build Coastguard Worker #include "helpers.h" 8*61046927SAndroid Build Coastguard Worker 9*61046927SAndroid Build Coastguard Worker bool util_lower_clearsize_to_dword(const void * clear_value,int * clear_value_size,uint32_t * out)10*61046927SAndroid Build Coastguard Workerutil_lower_clearsize_to_dword(const void *clear_value, int *clear_value_size, 11*61046927SAndroid Build Coastguard Worker uint32_t *out) 12*61046927SAndroid Build Coastguard Worker { 13*61046927SAndroid Build Coastguard Worker /* Reduce a large clear value size if possible. */ 14*61046927SAndroid Build Coastguard Worker if (*clear_value_size > 4) { 15*61046927SAndroid Build Coastguard Worker bool clear_dword_duplicated = true; 16*61046927SAndroid Build Coastguard Worker const uint32_t *value = clear_value; 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Worker /* See if we can lower large fills to dword fills. */ 19*61046927SAndroid Build Coastguard Worker for (unsigned i = 1; i < *clear_value_size / 4; i++) { 20*61046927SAndroid Build Coastguard Worker if (value[0] != value[i]) { 21*61046927SAndroid Build Coastguard Worker clear_dword_duplicated = false; 22*61046927SAndroid Build Coastguard Worker break; 23*61046927SAndroid Build Coastguard Worker } 24*61046927SAndroid Build Coastguard Worker } 25*61046927SAndroid Build Coastguard Worker if (clear_dword_duplicated) { 26*61046927SAndroid Build Coastguard Worker *out = *value; 27*61046927SAndroid Build Coastguard Worker *clear_value_size = 4; 28*61046927SAndroid Build Coastguard Worker } 29*61046927SAndroid Build Coastguard Worker return clear_dword_duplicated; 30*61046927SAndroid Build Coastguard Worker } 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker /* Expand a small clear value size. */ 33*61046927SAndroid Build Coastguard Worker if (*clear_value_size <= 2) { 34*61046927SAndroid Build Coastguard Worker if (*clear_value_size == 1) { 35*61046927SAndroid Build Coastguard Worker *out = *(uint8_t *)clear_value; 36*61046927SAndroid Build Coastguard Worker *out |= 37*61046927SAndroid Build Coastguard Worker (*out << 8) | (*out << 16) | (*out << 24); 38*61046927SAndroid Build Coastguard Worker } else { 39*61046927SAndroid Build Coastguard Worker *out = *(uint16_t *)clear_value; 40*61046927SAndroid Build Coastguard Worker *out |= *out << 16; 41*61046927SAndroid Build Coastguard Worker } 42*61046927SAndroid Build Coastguard Worker *clear_value_size = 4; 43*61046927SAndroid Build Coastguard Worker return true; 44*61046927SAndroid Build Coastguard Worker } 45*61046927SAndroid Build Coastguard Worker return false; 46*61046927SAndroid Build Coastguard Worker } 47