arm中的飽和指令


ARMv6 及更高版本中推出了飽和指令:SSAT 和 USAT, SSAT16 和 USAT16

有符號飽和到任何位位置和無符號飽和到任何位位置,可選擇在飽和前進行移位。

SSAT 可將有符號值飽和到有符號范圍內。

USAT 可將有符號值飽和到無符號范圍內。

語法

op{cond} Rd, #sat, Rm{, shift}

其中:

op

SSATUSAT

cond

是一個可選的條件代碼(請參閱條件執行)。

Rd

是目標寄存器。 Rd 不能為 r15。

sat

指定要飽和到的位位置,SSAT 的范圍在 1 到 32 之間,USAT 的范圍在 0 到 31 之間。

Rm

是包含操作數的寄存器。 Rm 不能為 r15。

shift

是一個可選的移位。 必須為下列項之一:

ASR #n

其中,n 的范圍為 1-32 (ARM) 或 1-31 (Thumb-2)

LSL #n

其中,n 的范圍為 0-31。

操作

SSAT 指令會先進行指定的移位,然后將結果飽和到有符號范圍 –2sat–1 ≤ x ≤ 2sat–1 –1。

USAT 指令會先進行指定的移位,然后將結果飽和到無符號范圍 0 ≤ x ≤ 2sat – 1。

條件標記

如果發生飽和,則這些指令設置 Q 標記。 若要讀取 Q 標記的狀態,請使用 MRS 指令(請參閱MRS)。

體系結構

這些 ARM 指令可用於 ARMv6 及更高版本。

這些 32 位 Thumb 指令可用於 ARMv6T2 及更高版本。

這些指令均無 16 位 Thumb 版本。

示例

    SSAT    r7, #16, r7, LSL #4    USATNE  r0, #7, r5
SSAT16 和 USAT16

並行半字飽和指令。

SSAT16 可將有符號值飽和到有符號范圍內。

USAT16 可將有符號值飽和到無符號范圍內。

語法

op{cond} Rd, #sat, Rn

其中:

op

是下列項之一:

SSAT16

有符號飽和。

USAT16

無符號飽和。

cond

是一個可選的條件代碼(請參閱條件執行)。

Rd

是目標寄存器。

sat

指定要飽和到的位位置,SSAT16 的范圍在 1 到 16 之間,USAT16 的范圍在 0 到 15 之間。

Rn

是存放操作數的寄存器。

不要將 r15 用作 RdRn

操作

有符號和無符號半字飽和任何位位置。

SSAT16 指令可將每個有符號半字飽和到有符號范圍 –2sat–1 ≤ x ≤ 2sat–1 –1 內。

USAT16 指令可將每個有符號半字飽和到無符號范圍 0 ≤ x ≤ 2sat –1 內。

條件標記

只要有半字發生飽和,這些指令就會設置 Q 標記。 若要讀取 Q 標記的狀態,請使用 MRS 指令(請參閱MRS)。

體系結構

這些 ARM 指令可用於 ARMv6 及更高版本。

這些 32 位 Thumb 指令可用於 ARMv6T2 及更高版本(ARMv7-M 架構除外)。

這些指令均無 16 位 Thumb 版本。

示例

    SSAT16  r7, #12, r7    USAT16  r0, #7, r5

不正確的示例

    SSAT16  r1, #16, r2, LSL #4 ; shifts not permitted with halfword saturations

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com