دالفيك بايت كود

التصميم العام

  • يهدف طراز الجهاز واتفاقيات الاستدعاء إلى تقليد البنى الحقيقية الشائعة واتفاقيات استدعاء النمط C تقريبًا:
    • الجهاز قائم على التسجيل ، ويتم تثبيت الإطارات في الحجم عند الإنشاء. يتكون كل إطار من عدد معين من السجلات (تحددها الطريقة) بالإضافة إلى أي بيانات مساعدة مطلوبة لتنفيذ الطريقة ، مثل (على سبيل المثال لا الحصر) عداد البرنامج ومرجع إلى ملف .dex الذي يحتوي على الطريقة .
    • عند استخدامها لقيم البت (مثل الأعداد الصحيحة وأرقام الفاصلة العائمة) ، تعتبر السجلات بعرض 32 بت. تُستخدم أزواج التسجيل المجاورة لقيم 64 بت. لا توجد متطلبات محاذاة لأزواج التسجيل.
    • عند استخدامها لمراجع الكائنات ، تعتبر السجلات واسعة بما يكفي لاحتواء مرجع واحد بالضبط.
    • من حيث تمثيل البتات ، (Object) null == (int) 0 .
    • يتم وضع وسيطات N الخاصة بإحدى الطرق في آخر سجلات N لإطار استدعاء الطريقة ، بالترتيب. الحجج الواسعة تستهلك سجلين. يتم تمرير طرق المثيل إلى this المرجع باعتباره الوسيطة الأولى.
  • وحدة التخزين في دفق التعليمات عبارة عن كمية غير موقعة ذات 16 بت. بعض البتات في بعض التعليمات يتم تجاهلها / يجب أن تكون صفرية.
  • لا تقتصر التعليمات دون مبرر على نوع معين. على سبيل المثال ، التعليمات التي تنقل قيم التسجيل 32 بت بدون تفسير لا تحتاج إلى تحديد ما إذا كانت تنقل قيم ints أو تعويم.
  • توجد تجمعات ثابتة مفهرسة ومعدودة بشكل منفصل للإشارة إلى السلاسل والأنواع والحقول والأساليب.
  • يتم تمثيل البيانات الحرفية على مستوى البت بشكل مضمّن في دفق التعليمات.
  • لأنه ، من الناحية العملية ، من غير المألوف أن تحتاج طريقة ما إلى أكثر من 16 سجلاً ، ولأن الحاجة إلى أكثر من ثمانية سجلات أمر شائع بشكل معقول ، فإن العديد من التعليمات تقتصر على معالجة أول 16 سجلاً فقط. عندما يكون ذلك ممكنًا بشكل معقول ، تسمح التعليمات بالإشارة إلى أول 256 سجلًا. بالإضافة إلى ذلك ، تحتوي بعض التعليمات على متغيرات تتيح عددًا أكبر من السجلات ، بما في ذلك زوج من إرشادات move الشاملة التي يمكنها معالجة السجلات في النطاق v0 - v65535 . في الحالات التي لا يتوفر فيها متغير التعليمات لمعالجة السجل المطلوب ، فمن المتوقع أن يتم نقل محتويات السجل من السجل الأصلي إلى سجل منخفض (قبل العملية) و / أو نقله من سجل نتيجة منخفض إلى سجل مرتفع التسجيل (بعد العملية).
  • هناك العديد من "التعليمات الزائفة" التي يتم استخدامها للاحتفاظ بحمولات بيانات متغيرة الطول ، والتي يشار إليها بالتعليمات العادية (على سبيل المثال ، fill-array-data ). يجب عدم مواجهة مثل هذه التعليمات أثناء التدفق الطبيعي للتنفيذ. بالإضافة إلى ذلك ، يجب أن تكون التعليمات موجودة على إزاحات كود البايت ذات الأرقام الزوجية (أي ، محاذاة 4 بايت). من أجل تلبية هذا المطلب ، يجب أن تصدر أدوات إنشاء dex تعليمات nop إضافية كفاصل إذا كانت هذه التعليمات غير محاذاة. أخيرًا ، على الرغم من أنه ليس مطلوبًا ، فمن المتوقع أن تختار معظم الأدوات إرسال هذه التعليمات في نهايات الطرق ، وإلا فمن المحتمل أن تكون هناك حاجة إلى تعليمات إضافية للتفرع حولها.
  • عند التثبيت على نظام قيد التشغيل ، قد يتم تغيير بعض التعليمات ، وتغيير تنسيقها ، كتحسين ربط ثابت في وقت التثبيت. هذا للسماح بتنفيذ أسرع بمجرد معرفة الارتباط. انظر وثيقة تنسيقات التعليمات ذات الصلة للمتغيرات المقترحة. يتم استخدام كلمة "مقترحة" بحذر ؛ ليس من الضروري تنفيذ هذه.
  • النحو البشري و فن الإستذكار:
    • ترتيب المصدر ثم الوسيطات.
    • تحتوي بعض أكواد التشغيل على لاحقة اسم واضحة للإشارة إلى النوع (الأنواع) التي تعمل عليها:
      • أكواد التشغيل 32 بت من النوع العام غير مميزة.
      • يتم إلحاق أكواد التشغيل من النوع العام 64 بت بـ -wide .
      • يتم إلحاق أكواد التشغيل الخاصة بالنوع بنوعها (أو اختصار مباشر) ، وهي واحدة من: -boolean - -char -byte -short -int -long -float -object - -double - -string -كائن -class سلسلة-فئة- -void .
    • تحتوي بعض أكواد التشغيل على لاحقة واضحة للتمييز بين العمليات المماثلة بخلاف ذلك والتي لها تخطيطات أو خيارات تعليمات مختلفة. يتم فصل هذه اللواحق عن الأسماء الرئيسية بشرطة مائلة (" / ") وهي موجودة أساسًا على الإطلاق لجعل هناك تعيين واحد لواحد مع ثوابت ثابتة في الشفرة التي تنشئ وتفسر الملفات التنفيذية (أي لتقليل الغموض للبشر).
    • في الأوصاف هنا ، يتم التأكيد على عرض القيمة (للإشارة ، على سبيل المثال ، نطاق ثابت أو عدد السجلات التي يمكن تناولها) من خلال استخدام حرف لكل أربعة بتات عرض.
    • على سبيل المثال ، في التعليمات " move-wide/from16 vAA, vBBBB ":
      • " move " هو رمز التشغيل الأساسي ، يشير إلى العملية الأساسية (نقل قيمة السجل).
      • " wide " هو لاحقة الاسم ، مما يشير إلى أنه يعمل على بيانات واسعة (64 بت).
      • " from16 " هي لاحقة كود التشغيل ، تشير إلى متغير يحتوي على مرجع تسجيل 16 بت كمصدر.
      • " vAA " هو سجل الوجهة (ضمنيًا من خلال العملية ؛ مرة أخرى ، القاعدة هي أن وسيطات الوجهة تأتي دائمًا أولاً) ، والتي يجب أن تكون في النطاق v0 - v255 .
      • " vBBBB " هو سجل المصدر ، والذي يجب أن يكون في النطاق v0 - v65535 .
  • راجع مستند تنسيقات التعليمات للحصول على مزيد من التفاصيل حول تنسيقات التعليمات المختلفة (المدرجة ضمن "Op & Format") بالإضافة إلى تفاصيل حول بنية شفرة التشغيل.
  • راجع مستند تنسيق ملف .dex . للحصول على مزيد من التفاصيل حول مكان ملاءمة الرمز الثانوي للصورة الأكبر.

ملخص مجموعة بايت كود

Op & Format ذاكري / بناء الجملة الحجج وصف
00 10x لا دورات النفايات.

ملاحظة: التعليمات الزائفة الحاملة للبيانات يتم تمييزها بكود التشغيل هذا ، وفي هذه الحالة يشير البايت عالي الترتيب لوحدة كود التشغيل إلى طبيعة البيانات. راجع "تنسيق packed-switch-payload sparse-switch-payload " و "تنسيق تحميل fill-array-data-payload " أدناه.

01 12x تحرك vA ، المنتدى A: سجل الوجهة (4 بتات)
B: سجل المصدر (4 بتات)
نقل محتويات سجل غير كائن إلى آخر.
02 22x نقل / من 16 vAA ، BBBBB A: سجل الوجهة (8 بتات)
B: سجل المصدر (16 بت)
نقل محتويات سجل غير كائن إلى آخر.
03 32x تحرك / 16 vAAAA ، BBBBB A: سجل الوجهة (16 بت)
B: سجل المصدر (16 بت)
نقل محتويات سجل غير كائن إلى آخر.
04 12x تحرك واسع vA ، المنتدى A: زوج تسجيل الوجهة (4 بتات)
B: زوج تسجيل المصدر (4 بتات)
انقل محتويات زوج مسجل إلى آخر.

ملاحظة: يعد الانتقال من v N إلى v N-1 أو v N+1 قانونيًا ، لذلك يجب أن ترتب عمليات التنفيذ نصفي زوج السجل ليتم قراءتهما قبل كتابة أي شيء.

05 22x تتحرك على نطاق واسع / من 16 vAA ، BBBBB A: زوج تسجيل الوجهة (8 بتات)
B: زوج تسجيل المصدر (16 بت)
انقل محتويات زوج مسجل إلى آخر.

ملاحظة: اعتبارات التنفيذ هي نفسها move-wide أعلاه.

06 32x اتساع الحركة / 16 vAAAA ، BBBBB A: زوج تسجيل الوجهة (16 بت)
B: زوج تسجيل المصدر (16 بت)
انقل محتويات زوج مسجل إلى آخر.

ملاحظة: اعتبارات التنفيذ هي نفسها move-wide أعلاه.

07 12x حرك الكائن vA ، BB A: سجل الوجهة (4 بتات)
B: سجل المصدر (4 بتات)
انقل محتويات سجل يحمل كائنًا إلى سجل آخر.
08 22x حرك الكائن / from16 vAA ، فربب A: سجل الوجهة (8 بتات)
B: سجل المصدر (16 بت)
انقل محتويات سجل يحمل كائنًا إلى سجل آخر.
09 32x كائن متحرك / 16 vAAAA ، BBBBB A: سجل الوجهة (16 بت)
B: سجل المصدر (16 بت)
انقل محتويات سجل يحمل كائنًا إلى سجل آخر.
0a 11x نتيجة الحركة vAA A: سجل الوجهة (8 بتات) انقل نتيجة الكلمة الواحدة non-object من invoke- kind الأحدث إلى السجل المشار إليه. يجب أن يتم ذلك invoke- kind الذي لا يمكن تجاهل نتيجته (كلمة مفردة ، غير كائن) ؛ في أي مكان آخر غير صالح.
0 ب 11x حركة نتيجة واسعة vAA A: زوج تسجيل الوجهة (8 بتات) انقل نتيجة الكلمة المزدوجة لأحدث invoke- kind إلى زوج التسجيل المشار إليه. يجب أن يتم ذلك invoke- kind الذي لا يمكن تجاهل نتيجته (الكلمة المزدوجة) ؛ في أي مكان آخر غير صالح.
0c 11x تحرك النتيجة وجوه vAA A: سجل الوجهة (8 بتات) انقل نتيجة الكائن من invoke- kind الأحدث إلى السجل المشار إليه. يجب أن يتم ذلك invoke- kind أو filled-new-array التي لا يمكن تجاهل نتيجتها (الكائن) ؛ في أي مكان آخر غير صالح.
0d 11x نقل استثناء vAA A: سجل الوجهة (8 بتات) حفظ استثناء تم اكتشافه للتو في السجل المحدد. يجب أن يكون هذا هو التعليمة الأولى لأي معالج استثناء لا يتم تجاهل استثناءه الذي تم اكتشافه ، ويجب أن يحدث هذا التوجيه فقط كأول تعليمة لمعالج الاستثناء ؛ في أي مكان آخر غير صالح.
0e 10x عودة الفراغ العودة من طريقة void .
0f 11x عودة vAA A: سجل قيمة الإرجاع (8 بت) العودة من طريقة أحادية العرض (32 بت) لإرجاع قيمة غير كائن.
10 11x عودة واسعة vAA A: زوج تسجيل القيمة المرجعة (8 بتات) العودة من طريقة إرجاع القيمة مزدوجة العرض (64 بت).
11 11x عودة الكائن vAA A: سجل قيمة الإرجاع (8 بت) العودة من طريقة إرجاع الكائن.
12 11 ن const / 4 فولت أمبير ، # + ب A: سجل الوجهة (4 بتات)
B: عدد صحيح موقعة (4 بتات)
انقل القيمة الحرفية المعطاة (الإشارة الممتدة إلى 32 بت) في السجل المحدد.
13 21 ثانية const / 16 vAA ، # + BBBB A: سجل الوجهة (8 بتات)
B: عدد صحيح موقعة (16 بت)
انقل القيمة الحرفية المعطاة (الإشارة الممتدة إلى 32 بت) في السجل المحدد.
14 31 ط const vAA ، # + BBBBBBBB A: سجل الوجهة (8 بتات)
B: ثابت 32 بت تعسفي
انقل القيمة الحرفية المحددة إلى السجل المحدد.
15 21 ح const / high16 vAA ، # + BBBB0000 A: سجل الوجهة (8 بتات)
B: عدد صحيح موقعة (16 بت)
انقل القيمة الحرفية المحددة (يمين - صفر ممتد إلى 32 بت) في السجل المحدد.
16 21 ثانية عرض const / 16 vAA ، # + BBBB A: سجل الوجهة (8 بتات)
B: عدد صحيح موقعة (16 بت)
انقل القيمة الحرفية المعطاة (علامة ممتدة إلى 64 بت) في زوج التسجيل المحدد.
17 31 ط عرض const / 32 vAA ، # + BBBBBBBB A: سجل الوجهة (8 بتات)
B: موقع int (32 بت)
انقل القيمة الحرفية المعطاة (علامة ممتدة إلى 64 بت) في زوج التسجيل المحدد.
18 51 لتر VAA واسع النطاق ، # + BBBBBBBBBBBBBBB A: سجل الوجهة (8 بتات)
B: ثابت العرض المزدوج التعسفي (64 بت)
انقل القيمة الحرفية المحددة إلى زوج التسجيل المحدد.
19 21 ح عرض const / ارتفاع 16 vAA ، # + BBBB000000000000 A: سجل الوجهة (8 بتات)
B: عدد صحيح موقعة (16 بت)
انقل القيمة الحرفية المعطاة (يمين - صفر ممتد إلى 64 بت) في زوج التسجيل المحدد.
1 أ 21 ج const سلسلة vAA ، سلسلة @ BBBB A: سجل الوجهة (8 بتات)
B: فهرس السلسلة
انقل مرجعًا إلى السلسلة المحددة بواسطة الفهرس المحدد إلى السجل المحدد.
1 ب 31 ج const-string / jumbo vAA ، سلسلة @ BBBBBBBB A: سجل الوجهة (8 بتات)
B: فهرس السلسلة
انقل مرجعًا إلى السلسلة المحددة بواسطة الفهرس المحدد إلى السجل المحدد.
1 ج 21 ج فئة const vAA ، اكتب @ BBBB A: سجل الوجهة (8 بتات)
B: نوع الفهرس
انقل مرجعًا إلى الفئة المحددة بواسطة الفهرس المحدد إلى السجل المحدد. في الحالة التي يكون فيها النوع المشار إليه بدائيًا ، سيخزن هذا مرجعًا للفئة المتدهورة للنوع البدائي.
1d 11x شاشة الدخول vAA A: سجل محمل مرجعي (8 بتات) الحصول على الشاشة للكائن المشار إليه.
1e 11x مراقبة الخروج vAA A: سجل محمل مرجعي (8 بتات) حرر الشاشة للكائن المشار إليه.

ملاحظة: إذا احتاجت هذه التعليمات إلى طرح استثناء ، فيجب أن تفعل ذلك كما لو أن الكمبيوتر قد تقدم بالفعل بعد التعليمات. قد يكون من المفيد التفكير في هذا على أنه تنفيذ التعليمات بنجاح (بمعنى ما) ، ويتم طرح الاستثناء بعد التعليمات ولكن قبل الحصول على الفرصة التالية للتشغيل. هذا التعريف يجعل من الممكن لطريقة ما استخدام كتلة تنظيف الشاشة (على سبيل المثال ، finally ) كتنظيف الشاشة لتلك الكتلة نفسها ، كطريقة للتعامل مع الاستثناءات التعسفية التي قد يتم إلقاؤها بسبب التنفيذ التاريخي لـ Thread.stop() ، مع الاستمرار في الحصول على النظافة الشخصية للمراقبة المناسبة.

1f 21c check-cast vAA ، اكتب @ BBBB A: سجل محمل مرجعي (8 بتات)
B: فهرس النوع (16 بت)
ClassCastException إذا كان المرجع في السجل المحدد لا يمكن تحويله إلى النوع المشار إليه.

ملاحظة: نظرًا لأن A يجب أن يكون دائمًا مرجعًا (وليس قيمة أولية) ، فسوف يفشل هذا بالضرورة في وقت التشغيل (أي أنه سيؤدي إلى استثناء) إذا كان B يشير إلى نوع بدائي.

20 22 ج مثيل vA ، BB ، اكتب @ CCCC A: سجل الوجهة (4 بتات)
B: سجل محمل مرجعي (4 بتات)
C: نوع الفهرس (16 بت)
قم بالتخزين في سجل الوجهة المحدد 1 إذا كان المرجع المشار إليه هو مثيل من النوع المحدد ، أو 0 إذا لم يكن كذلك.

ملاحظة: نظرًا لأن B يجب أن تكون دائمًا مرجعًا (وليست قيمة أولية) ، فسيؤدي ذلك دائمًا إلى تخزين 0 إذا كانت C تشير إلى نوع بدائي.

21 12x صفيف بطول vA ، BB A: سجل الوجهة (4 بتات)
B: سجل محمل مرجعي للصفيف (4 بتات)
التخزين في الوجهة المحددة يسجل طول المصفوفة المشار إليها في الإدخالات
22 21 ج مثيل جديد vAA ، اكتب @ BBBB A: سجل الوجهة (8 بتات)
B: نوع الفهرس
قم ببناء مثيل جديد من النوع المشار إليه ، مع تخزين مرجع له في الوجهة. يجب أن يشير النوع إلى فئة غير مصفوفة.
23 22 ج صفيف جديد vA ، BB ، اكتب @ CCCC A: سجل الوجهة (4 بتات)
B: سجل الحجم
C: نوع الفهرس
أنشئ مصفوفة جديدة من النوع والحجم المحددين. يجب أن يكون النوع من نوع مصفوفة.
24 35 ج مجموعة مملوءة جديدة {vC ، vD ، vE ، vF ، vG} ، اكتب @ BBBB A: حجم الصفيف وعدد الكلمات الوسيطة (4 بت)
B: فهرس النوع (16 بت)
C..G: سجلات الوسيطة (4 بت لكل منها)
أنشئ مصفوفة من النوع والحجم المحددين ، واملأها بالمحتويات المتوفرة. يجب أن يكون النوع من نوع مصفوفة. يجب أن تكون محتويات المصفوفة من كلمة واحدة (أي ، لا توجد مصفوفات long أو double ، لكن أنواع المراجع مقبولة). يتم تخزين المثيل المُنشأ باعتباره "نتيجة" بنفس الطريقة التي تخزن بها تعليمات استدعاء الطريقة نتائجها ، لذلك يجب نقل المثيل المُنشأ إلى سجل مع تعليمة move-result-object لاحقة على الفور (إذا كان سيتم استخدامها ).
25 3rc مجموعة / نطاق جديد ممتلئ {vCCCC .. vNNNN} ، اكتب @ BBBB A: حجم الصفيف وعدد الكلمات الوسيطة (8 بت)
B: فهرس النوع (16 بت)
C: سجل الوسيطة الأولى (16 بت)
N = A + C - 1
أنشئ مصفوفة من النوع والحجم المحددين ، واملأها بالمحتويات المتوفرة. التوضيحات والقيود هي نفسها filled-new-array ، الموضحة أعلاه.
26 31 ت ملء صفيف البيانات vAA ، + BBBBBBBB (مع البيانات التكميلية على النحو المحدد أدناه في "تنسيق fill-array-data-payload ") A: مرجع صفيف (8 بتات)
B: "فرع" موقع الإزاحة لتعليمات زائفة لبيانات الجدول (32 بت)
املأ المصفوفة بالبيانات المشار إليها. يجب أن يكون المرجع إلى صفيف من العناصر الأولية ، ويجب أن يتطابق جدول البيانات معه في النوع ويجب ألا يحتوي على عناصر أكثر مما يتناسب مع الصفيف. وهذا يعني أن المصفوفة قد تكون أكبر من الجدول ، وإذا كان الأمر كذلك ، يتم تعيين العناصر الأولية فقط من المصفوفة ، مع ترك الباقي بمفرده.
27 11x رمي vAA A: سجل الاستثناءات (8 بتات)
رمي الاستثناء المشار إليه.
28 10 أ غوتو + AA A: إزاحة فرع موقعة (8 بتات) القفز دون قيد أو شرط إلى التعليمات المشار إليها.

ملاحظة: يجب ألا تكون إزاحة الفرع 0 . (يمكن إنشاء حلقة التدوير بشكل قانوني إما باستخدام goto/32 أو من خلال تضمين nop كهدف قبل الفرع.)

29 20 طن غوتو / 16 + AAAA A: إزاحة فرع موقعة (16 بت)
القفز دون قيد أو شرط إلى التعليمات المشار إليها.

ملاحظة: يجب ألا تكون إزاحة الفرع 0 . (يمكن إنشاء حلقة التدوير بشكل قانوني إما باستخدام goto/32 أو من خلال تضمين nop كهدف قبل الفرع.)

2 أ 30 طن غوتو / 32 + AAAAAAAA A: إزاحة فرع موقعة (32 بت)
القفز دون قيد أو شرط إلى التعليمات المشار إليها.
2 ب 31 ت محول معبأ vAA ، + BBBBBBBB (مع البيانات التكميلية كما هو محدد أدناه في "تنسيق packed-switch-payload ") A: سجل للاختبار
B: "فرع" موقع الإزاحة لتعليمات زائفة لبيانات الجدول (32 بت)
انتقل إلى تعليمة جديدة بناءً على القيمة الموجودة في السجل المحدد ، باستخدام جدول التعويضات المقابلة لكل قيمة في نطاق متكامل معين ، أو انتقل إلى التعليمات التالية إذا لم يكن هناك تطابق.
2 ج 31 ت التبديل المتناثر vAA ، + BBBBBBBB (مع البيانات التكميلية على النحو المحدد أدناه في "تنسيق sparse-switch-payload للتبديل المتقطع") A: سجل للاختبار
B: "فرع" موقع الإزاحة لتعليمات زائفة لبيانات الجدول (32 بت)
انتقل إلى تعليمات جديدة بناءً على القيمة الموجودة في السجل المحدد ، باستخدام جدول مرتب لأزواج معادلة القيمة ، أو انتقل إلى التعليمات التالية إذا لم يكن هناك تطابق.
2 يوم 31 23 مرة cmp نوع vAA ، فيب ، vCC
2d: cmpl-float (انحياز lt)
2e: cmpg-float (gt bias)
2f: cmpl-double (انحياز lt)
30: cmpg-double (انحياز gt)
31: cmp طويل
A: سجل الوجهة (8 بتات)
B: أول سجل أو زوج المصدر
C: سجل المصدر الثاني أو الزوج
قم بإجراء النقطة العائمة المشار إليها أو المقارنة long ، واضبط a على 0 إذا كانت b == c ، أو 1 إذا كانت b > c ، أو -1 إذا كانت b < c . يشير "الانحياز" المُدرج لعمليات الفاصلة العائمة إلى كيفية معالجة مقارنات NaN : تُرجع تعليمات "gt bias" 1 لمقارنات NaN ، وتعيد تعليمات "lt bias" -1 .

على سبيل المثال ، للتحقق لمعرفة ما إذا كانت النقطة العائمة x < y فمن المستحسن استخدام cmpg-float ؛ تشير النتيجة -1 إلى أن الاختبار كان صحيحًا ، وتشير القيم الأخرى إلى أنه كان خاطئًا إما بسبب مقارنة صحيحة أو لأن إحدى القيم كانت NaN .

32. 37 22 ت if- test vA، BB، + CCCC
32: إذا- مكافئ
33: إذا- ني
34: لو-لتر
35: if-ge
36: إذا- جي تي
37: لو-لو
A: سجل أولاً للاختبار (4 بتات)
B: التسجيل الثاني للاختبار (4 بتات)
C: إزاحة فرع موقعة (16 بت)
تفرع إلى الوجهة المحددة إذا تمت مقارنة قيمتي السجلين المحددين كما هو محدد.

ملاحظة: يجب ألا تكون إزاحة الفرع 0 . (يمكن إنشاء حلقة الدوران بشكل قانوني إما عن طريق التفرع حول goto أو عن طريق تضمين nop كهدف قبل الفرع.)

38..3d 21t إذا- اختبار z vAA ، + BBBB
38: إذا- eqz
39: إذا-نيز
3 أ: if-ltz
3 ب: if-gez
3 ج: if-gtz
ثلاثي الأبعاد: if-lez
A: سجل للاختبار (8 بت)
B: إزاحة فرع موقعة (16 بت)
الفرع إلى الوجهة المحددة إذا كانت قيمة السجل المحدد تقارن بـ 0 كما هو محدد.

ملاحظة: يجب ألا تكون إزاحة الفرع 0 . (يمكن إنشاء حلقة الدوران بشكل قانوني إما عن طريق التفرع حول goto أو عن طريق تضمين nop كهدف قبل الفرع.)

3 هـ 43 × 10 (غير مستعمل) (غير مستعمل)
44..51 23x arrayop vAA ، و BBB ، و vCC
44: غيظ
45: على نطاق واسع
46: أجيت وجوه
47: aget-boolean
48: اجييت بايت
49: اجيت شار
4 أ: قصير العمر
4 ب: aput
4c: على مستوى aput
4d: كائن aput
4e: aput-boolean
4f: بايت بايت
50: أبوت شار
51: أبوت قصير
A: سجل القيمة أو الزوج ؛ قد يكون مصدر أو جزء (8 بت)
B: سجل الصفيف (8 بتات)
C: سجل الفهرس (8 بت)
نفذ عملية المصفوفة المحددة في الفهرس المحدد للصفيف المحدد ، أو التحميل أو التخزين في سجل القيمة.
52..5f 22c أنا مثيل vA ، المنتدى @ CCCC
52: iget
53: عرض iget
54: كائن iget
55: iget-boolean
56: إيغيت بايت
57: iget-char
58: iget-short
59: IPut
5 أ: على مستوى IPut
5 ب: iput-object
5 ج: iput-boolean
5d: iput بايت
5e: iput-char
5f: iput-short
A: سجل القيمة أو الزوج ؛ قد يكون مصدرًا أو معدلاً (4 بتات)
B: سجل الكائن (4 بتات)
C: فهرس مرجع حقل المثيل (16 بت)
نفذ العملية الميدانية لمثيل الكائن المحدد بالحقل المحدد ، أو التحميل أو التخزين في سجل القيمة.

ملاحظة: أكواد التشغيل هذه هي مرشحات معقولة للربط الثابت ، وتغيير وسيطة الحقل لتكون أكثر إزاحة مباشرة.

60. 6d 21c s staticop vAA ، الحقل @ BBBB
60: sget
61: على نطاق واسع
62: هدف
63: sget-boolean
64: sget-بايت
65: sget-char
66: قصيدة قصيرة
67: سبوت
68: على نطاق واسع
69: سبوت الجسم
6 أ: sput-boolean
6 ب: سبوت بايت
6 ج: سبوت شار
6 د: sput-short
A: سجل القيمة أو الزوج ؛ قد يكون مصدر أو جزء (8 بت)
B: مؤشر مرجعي للمجال الثابت (16 بت)
قم بإجراء العملية الميدانية الثابتة للكائن المحدد باستخدام الحقل الثابت المحدد ، أو التحميل أو التخزين في سجل القيمة.

ملاحظة: أكواد التشغيل هذه هي مرشحات معقولة للربط الثابت ، وتغيير وسيطة الحقل لتكون أكثر إزاحة مباشرة.

6 هـ 72 35 ج استدعاء- النوع {vC، vD، vE، vF، vG}، meth @ BBBB
6e: استدعاء افتراضي
6f: استدعاء سوبر
70: استدعاء مباشر
71: استدعاء ثابت
72: استدعاء الواجهة
A: عدد الكلمات الوسيطة (4 بت)
B: فهرس مرجع الأسلوب (16 بت)
C..G: سجلات الوسيطة (4 بت لكل منها)
اتصل بالطريقة المشار إليها. يمكن تخزين النتيجة (إن وجدت) مع متغير مناسب move-result* كتعليمات لاحقة مباشرة.

يتم استخدام الاستدعاء invoke-virtual لاستدعاء طريقة افتراضية عادية (طريقة ليست private أو static أو final وليست أيضًا مُنشئ).

عندما تشير method_id إلى طريقة من فئة غير واجهة ، يتم استخدام invoke-super لاستدعاء أقرب طريقة افتراضية للفئة الفائقة (على عكس الطريقة التي لها نفس method_id في فئة الاستدعاء). يتم الاحتفاظ بقيود الطريقة نفسها كما في invoke-virtual .

في الإصدار 037 من ملفات Dex أو ما بعده ، إذا كان method_id يشير إلى طريقة واجهة ، يتم استخدام invoke-super لاستدعاء الإصدار الأكثر تحديدًا والذي لا يتم تجاوزه من تلك الطريقة المحددة في تلك الواجهة. يتم الاحتفاظ بقيود الطريقة نفسها كما في invoke-virtual . في ملفات Dex السابقة للإصدار 037 ، يعد وجود واجهة method_id غير قانوني وغير معرف.

يتم استخدام الاستدعاء invoke-direct لاستدعاء طريقة مباشرة غير static (أي طريقة مثيل تكون بطبيعتها غير قابلة للتجاوز ، أي إما طريقة مثيل private أو مُنشئ).

يتم استخدام الاستدعاء الثابت invoke-static طريقة static (والتي تعتبر دائمًا طريقة مباشرة).

يتم استخدام invoke-interface الاستدعاء لاستدعاء طريقة interface ، أي على كائن لا تعرف صنفه الملموس ، باستخدام method_id يشير إلى interface .

ملاحظة: أكواد التشغيل هذه هي مرشحة معقولة للربط الثابت ، وتغيير وسيطة الطريقة لتكون أكثر إزاحة مباشرة (أو زوجًا منها).

73 10x (غير مستعمل) (غير مستعمل)
74..78 3rc استدعاء- النوع / النطاق {vCCCC .. vNNNN} ، meth @ BBBB
74: استدعاء الظاهري / المدى
75: استدعاء سوبر / المدى
76: استدعاء مباشر / نطاق
77: استدعاء ثابت / نطاق
78: استدعاء واجهة / نطاق
A: عدد الكلمات الوسيطة (8 بت)
B: فهرس مرجع الأسلوب (16 بت)
C: سجل الوسيطة الأولى (16 بت)
N = A + C - 1
اتصل بالطريقة المشار إليها. راجع الاستدعاء الأول - الوصف invoke- kind أعلاه للحصول على التفاصيل والتحذيرات والاقتراحات.
79..7a 10x (غير مستعمل) (غير مستعمل)
7 ب .8f 12x unop vA ، المنتدى
7 ب: neg-int
7 ج: لا كثافة
7 د: نيج طويل
7 هـ: لم يمض وقت طويل
7f: neg-float
80: نيج مزدوج
81: int-to-long
82: int-to-float
83: int-to-double
84: طويل إلى كثافة العمليات
85: طويل لتطفو
86: طويل لمضاعفة
87: تعويم إلى كثافة العمليات
88: تعويم إلى طويل
89: تعويم مضاعفة
8 أ: مزدوج إلى كثافة العمليات
8 ب: مضاعفة إلى طويلة
8 ج: مضاعفة لتعويم
8d: int-to-byte
8e: int-to-char
8f: int-to-short
A: سجل الوجهة أو الزوج (4 بتات)
B: سجل المصدر أو الزوج (4 بتات)
قم بتنفيذ العملية الأحادية المحددة في سجل المصدر ، وقم بتخزين النتيجة في سجل الوجهة.
90..أف 23 إكس binop vAA ، فيب ، vCC
90: الوظيفة الإضافية
91: sub-int
92: مول إنت
93: div-int
94: ريم إنت
95: و int
96: أو-كثافة العمليات
97: xor-int
98: shl-int
99: shr-int
9 أ: ushr-int
9 ب: إضافة طويلة
9 ج: شبه طويل
9 د: طويل
9 هـ: div-long
9f: ريم طويل
a0: وطويلة
a1: أو طويل
a2: xor-long
a3: shl طويل
a4: shr-long
a5: أوشر طويل
a6: إضافة تعويم
a7: تعويم فرعي
a8: مول تعويم
a9: div-float
aa: rem-float
أب: إضافة مزدوجة
التيار المتردد: شبه مزدوج
الإعلان: مول مزدوج
ae: div-double
af: rem-double
A: سجل الوجهة أو الزوج (8 ​​بتات)
B: سجل المصدر الأول أو الزوج (8 ​​بتات)
C: سجل أو زوج المصدر الثاني (8 بتات)
قم بإجراء العملية الثنائية المحددة على سجلي المصدر ، مع تخزين النتيجة في سجل الوجهة.

ملاحظة: على عكس العمليات الرياضية -long الأخرى (التي تأخذ أزواج التسجيل لكل من مصدرها الأول والثاني) ، shl-long ، و shr-long ، و ushr- ushr-long زوجًا مسجلاً لمصدرها الأول (القيمة المراد تغييرها ) ، ولكن سجل واحد لمصدرهم الثاني (مسافة التحول).

b0..cf 12x binop / 2addr vA، BB
b0: add-int / 2addr
b1: sub-int / 2addr
b2: mul-int / 2addr
b3: div-int / 2addr
b4: rem-int / 2addr
b5: and-int / 2addr
b6: or-int / 2addr
b7: xor-int / 2addr
b8: shl-int / 2addr
b9: shr-int / 2addr
ba: ushr-int / 2addr
bb: add-long / 2addr
قبل الميلاد: sub-long / 2addr
bd: مول طويل / 2addr
be: div-long / 2addr
bf: rem-long / 2addr
c0: and-long / 2addr
c1: or-long / 2addr
c2: xor-long / 2addr
c3: shl-long / 2addr
c4: shr-long / 2addr
c5: ushr-long / 2addr
c6: add-float / 2addr
c7: تعويم فرعي / 2addr
c8: مول تعويم / 2addr
c9: div-float / 2addr
ca: rem-float / 2addr
cb: add-double / 2addr
cc: sub-double / 2addr
القرص المضغوط: mul-double / 2addr
م: div-double / 2addr
cf: rem-double / 2addr
A: الوجهة والمصدر الأول أو الزوج (4 بتات)
B: سجل أو زوج المصدر الثاني (4 بتات)
قم بإجراء العملية الثنائية المحددة على سجلي المصدر ، مع تخزين النتيجة في سجل المصدر الأول.

ملاحظة: على عكس العمليات الرياضية -long/2addr الأخرى (التي تأخذ أزواج التسجيل لكل من الوجهة / المصدر الأول ومصدرها الثاني) ، shl-long/2addr و shr-long/2addr و ushr ushr-long/2addr خذ سجلاً زوج لوجهتهم / مصدرهم الأول (القيمة المراد إزاحتها) ، ولكن سجل واحد لمصدرهم الثاني (مسافة التحول).

d0..d7 22 ثانية binop / lit16 vA، BB، # + CCCC
d0: add-int / lit16
d1: rsub-int (طرح عكسي)
d2: mul-int / lit16
d3: div-int / lit16
d4: rem-int / lit16
d5: و int / lit16
d6: or-int / lit16
d7: xor-int / lit16
A: سجل الوجهة (4 بتات)
B: سجل المصدر (4 بتات)
C: ثابت int موقع (16 بت)
قم بتنفيذ العملية الثنائية المشار إليها في السجل المشار إليه (الوسيطة الأولى) والقيمة الحرفية (الوسيطة الثانية) ، وتخزين النتيجة في سجل الوجهة.

ملاحظة: لا يحتوي rsub-int على لاحقة لأن هذا الإصدار هو كود التشغيل الرئيسي لعائلته. أيضًا ، انظر أدناه للحصول على تفاصيل حول دلالاتها.

د ٨... هـ ٢ ٢٢ ب binop / lit8 vAA ، BBB ، # + CC
d8: add-int / lit8
d9: rsub-int / lit8
da: mul-int / lit8
ديسيبل: div-int / lit8
تيار مستمر: rem-int / lit8
dd: و int / lit8
de: or-int / lit8
مدافع: xor-int / lit8
e0: shl-int / lit8
e1: shr-int / lit8
e2: ushr-int / lit8
A: سجل الوجهة (8 بتات)
B: سجل المصدر (8 بت)
C: ثابت int موقع (8 بتات)
قم بتنفيذ العملية الثنائية المشار إليها في السجل المشار إليه (الوسيطة الأولى) والقيمة الحرفية (الوسيطة الثانية) ، وتخزين النتيجة في سجل الوجهة.

ملاحظة: انظر أدناه للحصول على تفاصيل حول دلالات rsub-int .

e3..f9 10x (غير مستعمل) (غير مستعمل)
fa 45cc استدعاء متعدد الأشكال {vC، vD، vE، vF، vG}، meth @ BBBB، proto @ HHHH A: عدد الكلمات الوسيطة (4 بت)
B: فهرس مرجع الأسلوب (16 بت)
C: جهاز استقبال (4 بتات)
D..G: سجلات الوسيطة (4 بت لكل منها)
H: فهرس مرجعي للنموذج الأولي (16 بت)
استدعاء الأسلوب متعدد الأشكال التوقيع المشار إليه. يمكن تخزين النتيجة (إن وجدت) مع متغير مناسب move-result* كتعليمات لاحقة مباشرة.

يجب أن يكون مرجع الأسلوب إلى أسلوب متعدد الأشكال للتوقيع ، مثل java.lang.invoke.MethodHandle.invoke أو java.lang.invoke.MethodHandle.invokeExact .

يجب أن يكون جهاز الاستقبال كائنًا يدعم الأسلوب متعدد الأشكال للتوقيع الذي يتم استدعاؤه.

يصف مرجع النموذج الأولي أنواع الوسيطات المتوفرة ونوع الإرجاع المتوقع.

قد يثير كود الاستدعاء invoke-polymorphic استثناءات عند تنفيذه. تم وصف الاستثناءات في وثائق API الخاصة بالطريقة متعددة الأشكال للتوقيع التي يتم استدعاؤها.

موجود في ملفات Dex بدءًا من الإصدار 038 وما بعده.
fb 4rcc استدعاء متعدد الأشكال / النطاق {vCCCC .. vNNNN}، meth @ BBBB، proto @ HHHH A: عدد الكلمات الوسيطة (8 بت)
B: فهرس مرجع الأسلوب (16 بت)
C: جهاز استقبال (16 بت)
H: فهرس مرجعي للنموذج الأولي (16 بت)
N = A + C - 1
استدعاء مقبض الطريقة المشار إليه. راجع وصف invoke-polymorphic أعلاه للحصول على التفاصيل.

موجود في ملفات Dex بدءًا من الإصدار 038 وما بعده.
نادي 35 ج استدعاء مخصص {vC، vD، vE، vF، vG}، call_site @ BBBB A: عدد الكلمات الوسيطة (4 بت)
B: فهرس مرجع موقع الاتصال (16 بت)
C..G: سجلات الوسيطة (4 بت لكل منها)
يقرر ويستدعي موقع المكالمة المشار إليه. قد يتم تخزين النتيجة من الاستدعاء (إن وجدت) مع متغير مناسب move-result* كتعليمات لاحقة على الفور.

يتم تنفيذ هذه التعليمات على مرحلتين: تحليل موقع الاتصال واستدعاء موقع الاتصال.

تتحقق دقة موقع الاستدعاء مما إذا كان موقع المكالمة المشار إليه له مثيل java.lang.invoke.CallSite مرتبط. إذا لم يكن الأمر كذلك ، فسيتم استدعاء طريقة رابط bootstrap لموقع الاستدعاء المشار إليه باستخدام الوسائط الموجودة في ملف DEX (انظر call_site_item ). تقوم طريقة رابط bootstrap بإرجاع مثيل java.lang.invoke.CallSite الذي سيتم ربطه بعد ذلك بموقع الاستدعاء المشار إليه في حالة عدم وجود اقتران. قد يكون هناك مؤشر ترابط آخر قد قام بالفعل بعمل الاقتران أولاً ، وإذا كان الأمر كذلك ، فسيستمر تنفيذ التعليمات مع أول مثيل java.lang.invoke.CallSite المرتبط.

يتم إجراء استدعاء موقع الاستدعاء على الهدف java.lang.invoke.MethodHandle لمثيل java.lang.invoke.CallSite الذي تم حله. يتم استدعاء الهدف كما لو كان تنفيذ invoke-polymorphic (موصوف أعلاه) باستخدام مقبض الأسلوب والوسيطات لتعليمات الاستدعاء invoke-custom كوسائط لاستدعاء معالجة أسلوب دقيق.

يتم تغليف الاستثناءات التي تم طرحها بواسطة طريقة رابط التمهيد في java.lang.BootstrapMethodError . يظهر BootstrapMethodError أيضًا إذا:
  • فشل طريقة رابط bootstrap في إرجاع مثيل java.lang.invoke.CallSite .
  • يحتوي java.lang.invoke.CallSite الذي تم إرجاعه على هدف معالجة أسلوب null .
  • هدف معالجة الأسلوب ليس من النوع المطلوب.
موجود في ملفات Dex بدءًا من الإصدار 038 وما بعده.
fd 3rc استدعاء / النطاق المخصص {vCCCC .. vNNNN} ، call_site @ BBBB A: عدد الكلمات الوسيطة (8 بت)
B: فهرس مرجع موقع الاتصال (16 بت)
C: سجل الوسيطة الأولى (16 بت)
N = A + C - 1
حل واستدعاء موقع اتصال. راجع الوصف invoke-custom أعلاه للحصول على التفاصيل.

موجود في ملفات Dex بدءًا من الإصدار 038 وما بعده.
fe 21c const-method-handle vAA ، method_handle @ BBBB A: سجل الوجهة (8 بتات)
B: مؤشر معالجة الطريقة (16 بت)
انقل مرجعًا إلى مؤشر الأسلوب المحدد بواسطة الفهرس المحدد إلى السجل المحدد.

موجود في ملفات Dex بدءًا من الإصدار 039 وما بعده.
صص ٢١ ج const-way-type vAA ، proto @ BBBB A: سجل الوجهة (8 بتات)
B: مرجع النموذج الأولي للطريقة (16 بت)
انقل مرجعًا إلى النموذج الأولي للأسلوب المحدد بواسطة الفهرس المحدد في السجل المحدد.

موجود في ملفات Dex بدءًا من الإصدار 039 وما بعده.

تنسيق حمولة التبديل المعبأة

اسم شكل وصف
الهوية فترة قصيرة = 0x0100 تحديد الكود الزائف
بحجم قريب عدد الإدخالات في الجدول
first_key int أول (وأدنى) قيمة حالة التبديل
الأهداف int [] قائمة size أهداف الفرع النسبية. الأهداف متعلقة بعنوان رمز تشغيل التبديل ، وليس هذا الجدول.

ملاحظة: العدد الإجمالي لوحدات الكود لمثيل من هذا الجدول هو (size * 2) + 4 .

تنسيق الحمولة النافعة التبديل المتناثر

اسم شكل وصف
الهوية فترة قصيرة = 0x0200 تحديد الكود الزائف
بحجم قريب عدد الإدخالات في الجدول
مفاتيح int [] قائمة قيم مفتاح size ، مرتبة من الأدنى إلى الأعلى
الأهداف int [] قائمة بأهداف الفرع النسبي size ، كل منها يتوافق مع القيمة الرئيسية في نفس الفهرس. الأهداف متعلقة بعنوان رمز تشغيل التبديل ، وليس هذا الجدول.

ملاحظة: العدد الإجمالي لوحدات الكود لمثيل من هذا الجدول هو (size * 4) + 2 .

ملء مجموعة البيانات تنسيق الحمولة

اسم شكل وصف
الهوية فترة قصيرة = 0x0300 تحديد الكود الزائف
عرض_العنصر قريب عدد البايتات في كل عنصر
بحجم uint عدد العناصر في الجدول
بيانات ubyte [] قيم البيانات

ملاحظة: العدد الإجمالي لوحدات الكود لمثيل من هذا الجدول هو (size * element_width + 1) / 2 + 4 .

تفاصيل العملية الحسابية

ملاحظة: يجب أن تتبع عمليات النقطة العائمة قواعد IEEE 754 ، باستخدام التدفق السفلي التدريجي تقريبًا إلى الأقرب ، ما لم ينص على خلاف ذلك.

كود التشغيل ج دلالات ملحوظات
int. Neg-int int32 أ ؛
نتيجة int32 = -a ؛
مكمل أحادي ثنائي.
لا int int32 أ ؛
نتيجة int32 = ~ a ؛
أحادي منها - مكمل.
نيج طويل int64 أ ؛
نتيجة int64 = -a ؛
مكمل أحادي ثنائي.
ليس طويل int64 أ ؛
نتيجة int64 = ~ a ؛
أحادي منها - مكمل.
نيج تعويم تطفو
float result = -a;
Floating point negation.
neg-double double a;
double result = -a;
Floating point negation.
int-to-long int32 a;
int64 result = (int64) a;
Sign extension of int32 into int64 .
int-to-float int32 a;
float result = (float) a;
Conversion of int32 to float , using round-to-nearest. This loses precision for some values.
int-to-double int32 a;
double result = (double) a;
Conversion of int32 to double .
long-to-int int64 a;
int32 result = (int32) a;
Truncation of int64 into int32 .
long-to-float int64 a;
float result = (float) a;
Conversion of int64 to float , using round-to-nearest. This loses precision for some values.
long-to-double int64 a;
double result = (double) a;
Conversion of int64 to double , using round-to-nearest. This loses precision for some values.
float-to-int float a;
int32 result = (int32) a;
Conversion of float to int32 , using round-toward-zero. NaN and -0.0 (negative zero) convert to the integer 0 . Infinities and values with too large a magnitude to be represented get converted to either 0x7fffffff or -0x80000000 depending on sign.
float-to-long float a;
int64 result = (int64) a;
Conversion of float to int64 , using round-toward-zero. The same special case rules as for float-to-int apply here, except that out-of-range values get converted to either 0x7fffffffffffffff or -0x8000000000000000 depending on sign.
float-to-double float a;
double result = (double) a;
Conversion of float to double , preserving the value exactly.
double-to-int double a;
int32 result = (int32) a;
Conversion of double to int32 , using round-toward-zero. The same special case rules as for float-to-int apply here.
double-to-long double a;
int64 result = (int64) a;
Conversion of double to int64 , using round-toward-zero. The same special case rules as for float-to-long apply here.
double-to-float double a;
float result = (float) a;
Conversion of double to float , using round-to-nearest. This loses precision for some values.
int-to-byte int32 a;
int32 result = (a << 24) >> 24;
Truncation of int32 to int8 , sign extending the result.
int-to-char int32 a;
int32 result = a & 0xffff;
Truncation of int32 to uint16 , without sign extension.
int-to-short int32 a;
int32 result = (a << 16) >> 16;
Truncation of int32 to int16 , sign extending the result.
add-int int32 a, b;
int32 result = a + b;
Twos-complement addition.
sub-int int32 a, b;
int32 result = a - b;
Twos-complement subtraction.
rsub-int int32 a, b;
int32 result = b - a;
Twos-complement reverse subtraction.
mul-int int32 a, b;
int32 result = a * b;
Twos-complement multiplication.
div-int int32 a, b;
int32 result = a / b;
Twos-complement division, rounded towards zero (that is, truncated to integer). This throws ArithmeticException if b == 0 .
rem-int int32 a, b;
int32 result = a % b;
Twos-complement remainder after division. The sign of the result is the same as that of a , and it is more precisely defined as result == a - (a / b) * b . This throws ArithmeticException if b == 0 .
and-int int32 a, b;
int32 result = a & b;
Bitwise AND.
or-int int32 a, b;
int32 result = a | b;
Bitwise OR.
xor-int int32 a, b;
int32 result = a ^ b;
Bitwise XOR.
shl-int int32 a, b;
int32 result = a << (b & 0x1f);
Bitwise shift left (with masked argument).
shr-int int32 a, b;
int32 result = a >> (b & 0x1f);
Bitwise signed shift right (with masked argument).
ushr-int uint32 a, b;
int32 result = a >> (b & 0x1f);
Bitwise unsigned shift right (with masked argument).
add-long int64 a, b;
int64 result = a + b;
Twos-complement addition.
sub-long int64 a, b;
int64 result = a - b;
Twos-complement subtraction.
mul-long int64 a, b;
int64 result = a * b;
Twos-complement multiplication.
div-long int64 a, b;
int64 result = a / b;
Twos-complement division, rounded towards zero (that is, truncated to integer). This throws ArithmeticException if b == 0 .
rem-long int64 a, b;
int64 result = a % b;
Twos-complement remainder after division. The sign of the result is the same as that of a , and it is more precisely defined as result == a - (a / b) * b . This throws ArithmeticException if b == 0 .
and-long int64 a, b;
int64 result = a & b;
Bitwise AND.
or-long int64 a, b;
int64 result = a | b;
Bitwise OR.
xor-long int64 a, b;
int64 result = a ^ b;
Bitwise XOR.
shl-long int64 a;
int32 b;
int64 result = a << (b & 0x3f);
Bitwise shift left (with masked argument).
shr-long int64 a;
int32 b;
int64 result = a >> (b & 0x3f);
Bitwise signed shift right (with masked argument).
ushr-long uint64 a;
int32 b;
int64 result = a >> (b & 0x3f);
Bitwise unsigned shift right (with masked argument).
add-float float a, b;
float result = a + b;
Floating point addition.
sub-float float a, b;
float result = a - b;
Floating point subtraction.
mul-float float a, b;
float result = a * b;
Floating point multiplication.
div-float float a, b;
float result = a / b;
Floating point division.
rem-float float a, b;
float result = a % b;
Floating point remainder after division. This function is different than IEEE 754 remainder and is defined as result == a - roundTowardZero(a / b) * b .
add-double double a, b;
double result = a + b;
Floating point addition.
sub-double double a, b;
double result = a - b;
Floating point subtraction.
mul-double double a, b;
double result = a * b;
Floating point multiplication.
div-double double a, b;
double result = a / b;
Floating point division.
rem-double double a, b;
double result = a % b;
Floating point remainder after division. This function is different than IEEE 754 remainder and is defined as result == a - roundTowardZero(a / b) * b .