4. פקודות לוגיות וברמת הביט#
4.1. מוסכמות המסמך#
סימון: Rd, Rn מציינים את אוגרי ARM R0-R7 פרט למקרה של הפקודות המיוחדות שבהן ניתן להשתמש ב-R0-R15. Rn<a-b> מציין אוגר ARM שתוכנו חייב להיות בטווח a <= contents <= b. במקרה של פקודות עם שני ארגומנטים של אוגרים, מותר שהם יהיו זהים. לדוגמה הפקודה הבאה תאפס את R0 (ב-Python R0 ^= R0) ללא קשר לתוכנו ההתחלתי.
eor(r0, r0)
פקודות אלה משפיעות על דגלי התנאי אלא אם צוין אחרת.
4.2. פקודות לוגיות#
and_(Rd, Rn)
Rd &= Rnorr(Rd, Rn)
Rd |= Rneor(Rd, Rn)
Rd ^= Rnmvn(Rd, Rn)
Rd = Rn ^ 0xffffffffכלומר Rd = המשלים ל-1 של Rnbic(Rd, Rn)
Rd &= ~Rnניקוי ביט של Rd בעזרת מסכה ב-Rn
שימו לב לשימוש ב-”and_“ במקום ”and“, משום ש-”and“ היא מילת מפתח שמורה ב-Python.
4.3. פקודות הזזה וסיבוב#
lsl(Rd, Rn<0-31>)
Rd <<= Rnlsr(Rd, Rn<1-32>)
Rd = (Rd & 0xffffffff) >> Rnהזזה לוגית ימינהasr(Rd, Rn<1-32>)
Rd >>= Rnהזזה אריתמטית ימינהror(Rd, Rn<1-31>)
Rd = rotate_right(Rd, Rn)Rd מסובב ימינה Rn ביטים.
סיבוב ב-(לדוגמה) שלושה ביטים פועל באופן הבא. אם Rd מכיל בתחילה את הביטים b31 b30..b0 אזי לאחר הסיבוב הוא יכיל b2 b1 b0 b31 b30..b3
4.4. פקודות מיוחדות#
דגלי התנאי אינם מושפעים מפקודות אלה.
clz(Rd, Rn)
Rd = count_leading_zeros(Rn)
count_leading_zeros(Rn) מחזיר את מספר ביטי האפס הבינאריים שלפני ביט האחד הבינארי הראשון ב-Rn.
rbit(Rd, Rn)
Rd = bit_reverse(Rn)
bit_reverse(Rn) מחזיר את תוכן Rn כשהביטים שלו הפוכים. אם Rn מכיל את הביטים b31 b30..b0 אזי Rd יוגדר ל-b0 b1 b2..b31
ניתן לספור ביטי אפס נגררים על ידי ביצוע היפוך ביטים לפני הרצת clz.