2022-04-04
scottxxxabc
在 Linux 核心原始程式碼中,lib/string.c 具備 memchr 的實作:
利用上述 SIMD within a register (SWAR) 的技巧,我們可改寫為以下 memchr_opt
函式:
根據題目提示得知需使用到 DETECT_CHAR
巨集,DETECT_CHAR
巨集的註解寫到此巨集會在參數 X
含有填滿 MASK
的 byte 時回傳非零。
DETECT_NULL
會在 X
含有 NULL byte 時回傳非零。MASK
的每個 byte 都以想要搜尋的字元填滿, 如果 X
的第 n 個 byte 等於想要蒐尋的字元, X ^ MASK
的第 n 個 byte 就會是 0
,可以用剛才的 DETECT_NULL
巨集偵測。memchr_opt
在第 54 ~ 57 行設定 MASK
。a
,以二進位表示為 0110 0001
,就要把MASK
的每個 byte 都設為 0110 0001
,在我的電腦上 long
為 64 bits, MASK
應為01100001 01100001 01100001 01100001 01100001 01100001 01100001 01100001
觀察題目的第 59 行,可以發現 while
迴圈每次應該要使用 DETECT_CHAR
來尋找 asrc
是否包含指定字元。
每次迴圈迭代應該要將 asrc
指標往後移動 long
的長度,並將 length
減少 long
的長度