-O
পতাকাটি, ফাংশন সহ সংকলিত x86_64 এ সম্ভবত একটি পরিষ্কার উদাহরণ সরবরাহ করতে
pub fn leet(a : i128) -> i128 {
a + 1337
}
সংকলন
example::leet:
mov rdx, rsi
mov rax, rdi
add rax, 1337
adc rdx, 0
ret
(আমার আসল পোস্টটি আপনি যা চেয়েছিলেন u128
তার চেয়ে বেশি ছিল i128
The ফাংশনটি একইভাবে একই কোডটি সংকলন করে, একটি ভাল প্রদর্শন যা স্বাক্ষরিত এবং স্বাক্ষরবিহীন সংযোজন একটি আধুনিক সিপিইউতে একই।)
অন্যান্য তালিকাটি অবিচ্ছিন্ন কোড তৈরি করেছে। এটি কোনও ডিবাগারে পা রাখা নিরাপদ, কারণ এটি নিশ্চিত করে যে আপনি যে কোনও জায়গায় ব্রেকপয়েন্ট রাখতে পারেন এবং প্রোগ্রামের যে কোনও লাইনে যে কোনও ভেরিয়েবলের অবস্থা পরীক্ষা করতে পারবেন। এটি পড়া ধীর এবং শক্ত। অপ্টিমাইজড সংস্করণটি কোডের সাথে অনেক বেশি কাছাকাছি যা আসলে উত্পাদনে চলবে।
a
এই ফাংশনটির প্যারামিটারটি এক জোড়া 64৪-বিট রেজিস্টার, rsi: rdi এ পাস করা হয়েছে। আরডিএক্স: রেক্স, আর এক জোড়া রেজিস্টারে ফলাফল ফিরে আসে। কোডের প্রথম দুটি লাইন যোগফলকে আরম্ভ করে a
।
তৃতীয় লাইন ইনপুটটির নিম্ন শব্দটিতে 1337 যুক্ত করে। যদি এটি ওভারফ্লো হয় তবে এটি সিপিইউর বহনকারী পতাকাটিতে 1 বহন করে। চতুর্থ লাইন ইনপুটটির উচ্চ শব্দের সাথে শূন্য যোগ করে — এটি বহন করা হলে 1 টি —
আপনি এটিকে দুটি-সংখ্যার সংখ্যায় এক-অঙ্কের সংখ্যার সাধারণ সংযোজন হিসাবে ভাবতে পারেন
a b
+ 0 7
______
তবে বেস 18,446,744,073,709,551,616 ভিত্তিতে। আপনি এখনও সর্বনিম্ন "সংখ্যার" যুক্ত করছেন, সম্ভবত পরবর্তী কলামে একটি 1 বহন করছেন, তারপরে পরবর্তী অঙ্কটি যুক্ত করে বহন করুন। বিয়োগ খুব মিল।
গুণকে অবশ্যই পরিচয় (2⁶⁴a + বি) (2⁶⁴c + d) = 2¹²⁸ac + 2⁶⁴ (বিজ্ঞাপন + বিসি) + বিডি ব্যবহার করতে হবে, যেখানে এই প্রতিটি গুণকে এক রেজিস্টারে পণ্যটির উপরের অর্ধেক এবং পণ্যটির নীচের অর্ধেক প্রদান করে অন্য। এই শর্তগুলির মধ্যে কিছু বাদ দেওয়া হবে, কারণ 128 তম উপরে বিটগুলি কোনও মাপসই করা হয় না u128
এবং তা ফেলে দেওয়া হয়। তবুও, এটি বেশ কয়েকটি মেশিনের নির্দেশনা নেয়। বিভাগও বিভিন্ন পদক্ষেপ নেয়। একটি স্বাক্ষরিত মানের জন্য, গুণ এবং বিভাগের অতিরিক্ত অপারেন্ডস এবং ফলাফলের লক্ষণগুলিকে রূপান্তর করতে হবে need এই অপারেশনগুলি মোটেই খুব দক্ষ নয়।
অন্যান্য স্থাপত্যগুলিতে এটি আরও সহজ বা শক্ত হয় gets আরআইএসসি-ভি একটি 128-বিট নির্দেশ-সেট এক্সটেনশানটি সংজ্ঞায়িত করেছে, যদিও আমার জ্ঞানের কাছে কেউ এটিকে সিলিকনে প্রয়োগ করেনি। এই এক্সটেনশন ছাড়াই, আরআইএসসি-ভি আর্কিটেকচার ম্যানুয়াল শর্তসাপেক্ষ শাখার প্রস্তাব দেয় :addi t0, t1, +imm; blt t0, t1, overflow
স্পার্কের x86 এর নিয়ন্ত্রণ পতাকার মতো নিয়ন্ত্রণ কোড রয়েছে তবে সেগুলি add,cc
সেট করার জন্য আপনাকে একটি বিশেষ নির্দেশ ব্যবহার করতে হবে । অন্যদিকে, এমআইপিএসের জন্য আপনাকে দুটি স্বাক্ষরবিহীন পূর্ণসংখ্যার যোগফলের তুলনায় কঠোরভাবে কম কিনা তা যাচাই করা দরকার। যদি তাই হয় তবে সংযোজন উপচে পড়েছে। কমপক্ষে আপনি শর্তাধীন শাখা ছাড়াই ক্যারি বিটের মানতে অন্য একটি রেজিস্টার সেট করতে সক্ষম হন।