Обработка ошибок страницы с помощью vec_ld

У меня есть следующая программа для загрузки вектора в векторный регистр.

char *buf = (char *)malloc(10);

vector unsigned char t = vec_perm( vec_ld( 0, (unsigned char *)buf),
                                   vec_ld( 15, (unsigned char *)buf),
                                   vec_lvsl( 0, (unsigned char *)buf)
                              );

Если буфер заканчивается до конца страницы, например, давайте возьмем страницу с адресом от 0 до 4000, а буфер начинается с 3990. Второй vec_ld выровняет адрес по адресу меньше (3990 + 15), который будет равно 4000.

Если страница, начинающаяся с адреса 4000, не сопоставлена, вышеуказанная программа завершится сбоем.

Как избежать ошибки сегментации?

Все, о чем я могу думать, это использовать memcpy для копирования данных из буфера в векторный регистр, когда размер меньше 16 байт.


person sunmoon    schedule 23.01.2015    source источник
comment
В общем, вам нужно спроектировать макет данных так, чтобы было достаточно заполнения для поддержки любых 16-байтовых загрузок, которые вы можете выполнить. Обычно это означает округление размеров ваших массивов, чтобы сделать их кратными 16 байтам, и, возможно, добавление еще 16 байтов для хорошей меры (может упростить поддержку конвейерных циклов).   -  person Paul R    schedule 23.01.2015
comment
В вашем примере вы хотите загрузить 10 байтов в 16-байтовый вектор. Я полагаю, что из-за побочного эффекта это может не вызвать ошибку сегментации, но дизайн (загрузка 10 байтов в векторе) кажется неправильным.   -  person amigadev    schedule 15.03.2015