মরিচের 128-বিট পূর্ণসংখ্যা ger i128` কীভাবে 64-বিট সিস্টেমে কাজ করে?


128

মরিচায় 128-বিট পূর্ণসংখ্যা রয়েছে, এগুলি ডেটা টাইপের i128(এবং u128স্বাক্ষরযুক্ত স্বাক্ষরের জন্য) দ্বারা চিহ্নিত করা হয় :

let a: i128 = 170141183460469231731687303715884105727;

কীভাবে জাস্ট এই i128মানগুলি একটি 64-বিট সিস্টেমে কাজ করে; যেমন এটি গাণিতিক কীভাবে করে?

যেহেতু, আমি যতদূর জানি, মানটি একটি x86-64 সিপিইউর একটি রেজিস্টারে ফিট করতে পারে না, সংকলকটি কোনও একর জন্য কোনও i128মানের জন্য 2 টি রেজিস্টার ব্যবহার করে ? অথবা তারা পরিবর্তে তাদের উপস্থাপনের জন্য কোনও ধরণের বড় পূর্ণসংখ্যার কাঠামো ব্যবহার করছেন?


58
ঠিক ঠিক ঠিক একইভাবে 32-বিট কম্পিউটারগুলিতে 64-বিট প্রকারগুলি সংরক্ষণ করা হয় বা 32-বিট প্রকার 16-বিট কম্পিউটারগুলিতে সঞ্চিত হয় 32 32 বিট অ্যাপ্লিকেশনটিতে 64 বিট পূর্ণসংখ্যা ব্যবহার করা ঠিক কি? , 32-বিট মেশিনে কীভাবে 64-বিট গণিত সম্পন্ন হয়? , Bit৪ বিট ডেটা টাইপ , 128 বিট ইন্টিজার সি সহ , কীভাবে 32 বিট প্রসেসর 64 বিট ইন্টিজার সমর্থন করে?
ফুক্লভিভি 4'19

54
যখন আপনার কেবল 10 টি আঙুল থাকে তখন কীভাবে একটি দুই-অঙ্ক পূর্ণসংখ্যা কাজ করবে?
জার্গ ডব্লু মিত্তাগ

27
@ জর্জিডব্লিউমিতাগ: আহ - পুরাতন "মাত্র দশটি আঙ্গুলযুক্ত দুটি অঙ্কের সংখ্যা" হে হে. ভেবেছিলেন আপনি আমাকে সেই পুরানোটির সাথে বোকা বানাতে পারবেন, তাই না? ঠিক আছে, আমার বন্ধু, যেহেতু দ্বিতীয় শ্রেণির একজন শিক্ষার্থী আপনাকে বলতে পারে - পায়ের আঙ্গুলগুলি এটাই! ( পিটার বিক্রেতাদের কাছে ক্ষমাপ্রার্থনা সহ ... এবং লেডি লিটন :-)
বব জার্ভিস - মনিকা পুনরায়

1
এফডাব্লুআইডাব্লিউ বেশিরভাগ x86 মেশিনে সিমডি অপারেশনের জন্য কিছু বিশেষ 128-বিট বা আরও বড় রেজিস্টার রয়েছে। দেখুন en.wikipedia.org/wiki/Streaming_SIMD_Extensions সম্পাদনা: আমি একরকম @ eckes এর মন্তব্য মিস
Ryan1729

4
@ জার্গডব্লিউমিতাগ নাহ, কম্পিউটার বিজ্ঞানীরা পৃথক আঙ্গুলগুলি কমিয়ে বা প্রসারিত করে বাইনারি গণনা করেন। এবং এখন, 132
ইয়াল

উত্তর:


141

সমস্ত জাস্ট এর পূর্ণসংখ্যা টাইপগুলি এলএলভিএম পূর্ণসংখ্যায় সংকলিত হয় । এলএলভিএম বিমূর্ত মেশিনটি 1 থেকে 2 ^ 23 - 1 পর্যন্ত কোনও বিট প্রস্থের পূর্ণসংখ্যার অনুমতি দেয় * * এলএলভিএম নির্দেশাবলী সাধারণত কোনও আকারের পূর্ণসংখ্যার উপর কাজ করে।

স্পষ্টতই, সেখানে খুব বেশি 8388607-বিট আর্কিটেকচার নেই, সুতরাং কোডটি যখন স্থানীয় মেশিন কোডে সংকলিত হয়, তখন এলএলভিএম কীভাবে এটি প্রয়োগ করতে হয় তা সিদ্ধান্ত নিতে হবে। বিমূর্ত নির্দেশের শব্দার্থকতা addএলএলভিএম নিজেই সংজ্ঞায়িত হয়। সাধারণত, স্থানীয় কোডে একক-শিক্ষার সমতুল্য বিমূর্ত নির্দেশাবলী সেই স্থানীয় নির্দেশের সাথে সংকলিত হবে, যখন সেগুলি নকল করা হবে না, সম্ভবত একাধিক নেটিভ নির্দেশাবলীর সাহায্যে। ম্যাকার্টনের উত্তরটি দেখায় যে কীভাবে এলএলভিএম স্থানীয় এবং অনুকরণীয় নির্দেশাবলী দুটি সংকলন করে।

(এটি কেবল নেটিভ মেশিনের চেয়ে বড় সংখ্যার চেয়ে বড় পূর্ণসংখ্যার ক্ষেত্রেই প্রযোজ্য না, তবে এটির চেয়েও ছোট যা তাদের ক্ষেত্রেও উদাহরণস্বরূপ, আধুনিক স্থাপত্যগুলি সম্ভবত 8-বিট পাটিগণিতকে সমর্থন করে না, সুতরাং addদুটি i8সংস্থার কোনও নির্দেশ অনুকরণ করা যেতে পারে আরও বিস্তৃত নির্দেশ সহ অতিরিক্ত বিট ফেলে দেওয়া)

সংকলক একরকম কোনও i128মানের জন্য 2 টি রেজিস্টার ব্যবহার করে ? অথবা তারা উপস্থাপনের জন্য কোনও ধরণের বড় পূর্ণসংখ্যার কাঠামো ব্যবহার করছেন?

এলএলভিএম আইআর স্তরে, উত্তরটি কোনওটিই নয়: i128কেবলমাত্র প্রতিটি অন্যান্য একক-মূল্যবান টাইপের মতোই একটি একক নিবন্ধেই ফিট করে । অন্যদিকে, একবার মেশিন কোডে অনুবাদ করা, দুজনের মধ্যে আসলেই কোনও পার্থক্য নেই, কারণ স্ট্রাইকগুলি রেজিস্টারগুলিতে ঠিক পূর্ণসংখ্যার মতো পচে যায়। পাটিগণিত করার সময়, এটি একটি খুব নিরাপদ বাজি যে এলএলভিএম কেবলমাত্র পুরো দুটি জিনিসকে দুটি রেজিস্টারে লোড করবে।


* তবে, সমস্ত এলএলভিএম ব্যাকেন্ড সমানভাবে তৈরি হয় না। এই উত্তরটি x86-64 এর সাথে সম্পর্কিত। আমি বুঝতে পারি যে 128 এর চেয়েও বড় আকারের এবং দু'জনের ক্ষমতার জন্য ব্যাকএন্ড সমর্থন স্পটটি (যা আংশিকভাবে ব্যাখ্যা করতে পারে কেন মরিচ কেবলমাত্র 8-, 16-, 32-, 64- এবং 128-বিট পূর্ণসংখ্যা প্রকাশ করে)। রেডডিট-এ এস্ট 31 অনুসারে , rustc সফ্টওয়্যারগুলিতে 128 বিট ইন্টিজার প্রয়োগ করে যখন ব্যাকএন্ডকে স্থানীয়ভাবে সমর্থন করে না তাদের লক্ষ্য করে।


1
হু, আমি আশ্চর্য হয়েছি কেন এটি আরও সাধারণ 2 ^ 32 এর পরিবর্তে 2 ^ 23 (ভাল, সংখ্যার সংকলক ব্যাকकेন্ডগুলি দ্বারা সমর্থিত পূর্ণসংখ্যার সর্বাধিক বিট প্রস্থের ক্ষেত্রে নয়, এই সংখ্যাগুলি প্রায়শই প্রদর্শিত হয় তার পরিপ্রেক্ষিতে বিস্তৃতভাবে কথা বলতে ...)
তহবিল মনিকার লসুইট

26
@ নিক হার্টলি এলএলভিএমের কিছু বেসক্লাসের একটি ক্ষেত্র রয়েছে যেখানে সাবক্লাসগুলি ডেটা সঞ্চয় করতে পারে। Typeশ্রেণীর জন্য এর অর্থ এটি কী ধরণের (ফাংশন, ব্লক, পূর্ণসংখ্যা, ...) এবং সাবক্লাস ডেটার জন্য 24 বিট সংরক্ষণ করার জন্য 8 টি বিট রয়েছে। IntegerTypeবর্গ তারপর ঐ 24 বিট ব্যবহার আকার সঞ্চয় করতে, দৃষ্টান্ত সুন্দরভাবে 32 বিট মাপসই করতে সক্ষম হবেন!
টড সয়েল 21

56

সংকলক এগুলি একাধিক নিবন্ধগুলিতে সংরক্ষণ করবে এবং প্রয়োজনে সেই মানগুলিতে পাটিগণিত করতে একাধিক নির্দেশনা ব্যবহার করবে। বেশিরভাগ আইএসএর সাথে এক্সadc ৮'s-এর মতো একটি অ্যাড-সহ ক্যারি নির্দেশনা রয়েছে যা প্রসারিত-যথার্থ পূর্ণসংখ্যা অ্যাড / সাব করতে যথেষ্ট দক্ষ করে তোলে।

উদাহরণস্বরূপ, দেওয়া

fn main() {
    let a = 42u128;
    let b = a + 1337;
}

অপ্টিমাইজেশন ছাড়াই x86-64 এর জন্য সংকলন করার সময়
সংকলকটি নিম্নলিখিতটি উত্পন্ন করে: (@ পিটারকর্ডস দ্বারা যুক্ত মন্তব্য)

playground::main:
    sub rsp, 56
    mov qword ptr [rsp + 32], 0
    mov qword ptr [rsp + 24], 42         # store 128-bit 0:42 on the stack
                                         # little-endian = low half at lower address

    mov rax, qword ptr [rsp + 24]
    mov rcx, qword ptr [rsp + 32]        # reload it to registers

    add rax, 1337                        # add 1337 to the low half
    adc rcx, 0                           # propagate carry to the high half. 1337u128 >> 64 = 0

    setb    dl                           # save carry-out (setb is an alias for setc)
    mov rsi, rax
    test    dl, 1                        # check carry-out (to detect overflow)
    mov qword ptr [rsp + 16], rax        # store the low half result
    mov qword ptr [rsp + 8], rsi         # store another copy of the low half
    mov qword ptr [rsp], rcx             # store the high half
                             # These are temporary copies of the halves; probably the high half at lower address isn't intentional
    jne .LBB8_2                       # jump if 128-bit add overflowed (to another not-shown block of code after the ret, I think)

    mov rax, qword ptr [rsp + 16]
    mov qword ptr [rsp + 40], rax     # copy low half to RSP+40
    mov rcx, qword ptr [rsp]
    mov qword ptr [rsp + 48], rcx     # copy high half to RSP+48
                  # This is the actual b, in normal little-endian order, forming a u128 at RSP+40
    add rsp, 56
    ret                               # with retval in EAX/RAX = low half result

যেখানে আপনি দেখতে পাচ্ছেন যে মানটি 42সঞ্চিত আছে raxএবং rcx

(সম্পাদকের দ্রষ্টব্য: x86-64 সি কলিং কনভেনশনগুলি আরডিএক্স: আরএক্সে 128-বিট পূর্ণসংখ্যা mainফেরত দেয় । তবে এটি কোনও মান দেয় না All সমস্ত অপ্রয়োজনীয় অনুলিপি খাঁটি অপ্টিমাইজেশন অক্ষম করা থেকে, এবং সেই মরিচটি আসলে ডিবাগের ওভারফ্লো পরীক্ষা করে মোড.)

তুলনার জন্য, এখানে x86-64-তে মরিচা bit৪-বিট পূর্ণসংখ্যার asm রয়েছে যেখানে কোনও যোগ-সহ-বহনের প্রয়োজন নেই, প্রতিটি মানের জন্য কেবল একটি একক রেজিস্টার বা স্ট্যাক-স্লট।

playground::main:
    sub rsp, 24
    mov qword ptr [rsp + 8], 42           # store
    mov rax, qword ptr [rsp + 8]          # reload
    add rax, 1337                         # add
    setb    cl
    test    cl, 1                         # check for carry-out (overflow)
    mov qword ptr [rsp], rax              # store the result
    jne .LBB8_2                           # branch on non-zero carry-out

    mov rax, qword ptr [rsp]              # reload the result
    mov qword ptr [rsp + 16], rax         # and copy it (to b)
    add rsp, 24
    ret

.LBB8_2:
    call panic function because of integer overflow

সেটব / পরীক্ষাটি এখনও সম্পূর্ণ অপ্রয়োজনীয়: jc(সিএফ = 1 টি লাফিয়ে তোলা) ঠিক ঠিক কাজ করবে।

অপ্টিমাইজেশন সক্ষম করার সাথে, মরিচা সংকলক ওভারফ্লো পরীক্ষা করে না যাতে +কাজ করে .wrapping_add()


4
@ আনুশ নং, র্যাক্স / আরএসপি / ... হ'ল 64-বিট রেজিস্টার। প্রতিটি 128-বিট নম্বর দুটি রেজিস্টার / মেমরি স্থানে সংরক্ষণ করা হয়, যার ফলস্বরূপ দুটি 64-বিট সংযোজন হবে।
মানফপি

5
@ আনুশ: না, এটি কেবলমাত্র এতগুলি নির্দেশাবলী ব্যবহার করছে কারণ এটি অপ্টিমাইজেশন অক্ষম করে সংকলিত হয়েছে। আপনি দেখতে চাই অনেক সহজ কোড (শুধু যোগ / এডিসি মত) যদি আপনি একটি ফাংশন যে দুটি নেন কম্পাইল u128(এই মত args এবং একটি মান godbolt.org/z/6JBza0 কাজ করা থেকে কম্পাইলার থামাতে পরিবর্তে অপ্টিমাইজেশান নিষ্ক্রিয় এর), সংকলন-সময় ধ্রুবক আরোগুলি উপর ধ্রুবক প্রচার।
পিটার কর্ডেস

3
@ CAD97 রিলিজ মোডে রিপিং পাটিগণিত ব্যবহার করে তবে ওভারফ্লো এবং ডিবিগ মোডের মতো আতঙ্কের জন্য যাচাই করে না। এই আচরণটি আরএফসি 560 দ্বারা সংজ্ঞায়িত করা হয়েছিল । এটি ইউবি নয়
ট্রেন্টক্লা

3
@ পিটারকর্ডস: বিশেষত, মরিচা ভাষা নির্দিষ্ট করে যে ওভারফ্লো অনির্দিষ্ট is এবং রাস্টক (একমাত্র সংকলক) দুটি আচরণ বেছে নিতে বেছে নেয়: প্যানিক বা মোড়ক। আদর্শভাবে, প্যানিক ডিফল্টরূপে ব্যবহৃত হত। অনুশীলনে, সাব-অনুকূল কোড-জেনারেশনের কারণে রিলিজ মোডে ডিফল্টটি মোড়ানো হয় এবং মূলধারার ব্যবহারের জন্য কোড-জেনারেশন "যদি যথেষ্ট থাকে তবে" প্যানিকে চলে যাওয়া একটি দীর্ঘমেয়াদী লক্ষ্য। এছাড়াও, সমস্ত জাস্ট ইন্টিগ্রাল টাইপগুলি আচরণ বেছে নেওয়ার জন্য নামের ক্রিয়াকলাপগুলিকে সমর্থন করে: চেক করা, মোড়ানো, স্যাচুরটিং, ... যাতে আপনি প্রতিটি অপারেশন ভিত্তিতে নির্বাচিত আচরণকে ওভাররাইড করতে পারেন।
ম্যাথিউ এম।

1
@ ম্যাথিউইউম: হ্যাঁ, আমি মোড়কে বনাম পরীক্ষিত বনাম স্যাচুরেটিং অ্যাড / সাব / শিফট / আদিম ধরণের যেকোন পদ্ধতি পছন্দ করি love সি এর মোড়কে স্বাক্ষরবিহীনতার চেয়ে অনেক বেশি ভাল, ইউবি আপনাকে তার ভিত্তিতে বাছাই করতে বাধ্য করেছে signed যাইহোক, কিছু আইএসএ প্যানিকের জন্য দক্ষ সহায়তা সরবরাহ করতে পারে, উদাহরণস্বরূপ একটি স্টিকি পতাকা যা আপনি ক্রিয়াকলাপের পুরো ক্রম পরে পরীক্ষা করতে পারেন। (X86 এর অফ বা সিএফের বিপরীতে যা 0 বা 1 দিয়ে ওভাররাইট করা হয়) উদাহরণস্বরূপ আগ্নার ফগের প্রস্তাবিত ফরোয়ার্ডকম আইএসএ ( agner.org/optimize/blog/read.php?i=421#478 ) তবে এটি এখনও কোনও গণনা না করার জন্য অপ্টিমাইজেশনকে সীমাবদ্ধ করে মরিচা উত্সটি করেনি। : /
পিটার কর্ডেস

30

হ্যাঁ, 32-বিট মেশিনগুলিতে 64-বিট ইন্টিজারগুলি ঠিক একইভাবে পরিচালনা করা হয়েছিল, বা 16-বিট মেশিনে 32-বিট ইন্টিজারগুলি, বা 8- বিট মেশিনে 16- এবং 32-বিট ইন্টিজারগুলি এখনও মাইক্রোকন্ট্রোলারদের জন্য প্রযোজ্য! )। হ্যাঁ, আপনি দুটি নিবন্ধে বা মেমরির অবস্থানগুলিতে বা যে কোনও কিছুতে (এটি আসলে কোনও বিষয় নয়) সংরক্ষণ করুন। সংযোজন এবং বিয়োগফল দু'টি নির্দেশাবলী গ্রহণ করে এবং বহন পতাকা ব্যবহার করে v গুণটির জন্য তিনটি গুণ এবং কিছু সংযোজন প্রয়োজন (ইতিমধ্যে -৪-বিট চিপগুলির মধ্যে একটি 64x64-> 128 গুণমান অপারেশন রয়েছে যা দুটি রেজিস্টারে আউটপুট দেয়)। বিভাগ ... একটি সাবরুটিন প্রয়োজন এবং বেশ ধীরে ধীরে (কিছু ক্ষেত্রে যেখানে ধ্রুবক দ্বারা বিভাগ একটি শিফট বা গুণে রূপান্তরিত হতে পারে) বাদে তবে এটি এখনও কার্যকর হয়। বিটওয়াইস এবং / অথবা / এক্সোর কেবল উপরের এবং নীচের অংশে পৃথকভাবে করতে হবে to ঘূর্ণন এবং মাস্কিং দিয়ে শিফ্টগুলি সম্পন্ন করা যায়। এবং এটি বেশ কিছু জিনিসকে coversেকে রাখে।


26

-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তার চেয়ে বেশি ছিল i128The ফাংশনটি একইভাবে একই কোডটি সংকলন করে, একটি ভাল প্রদর্শন যা স্বাক্ষরিত এবং স্বাক্ষরবিহীন সংযোজন একটি আধুনিক সিপিইউতে একই।)

অন্যান্য তালিকাটি অবিচ্ছিন্ন কোড তৈরি করেছে। এটি কোনও ডিবাগারে পা রাখা নিরাপদ, কারণ এটি নিশ্চিত করে যে আপনি যে কোনও জায়গায় ব্রেকপয়েন্ট রাখতে পারেন এবং প্রোগ্রামের যে কোনও লাইনে যে কোনও ভেরিয়েবলের অবস্থা পরীক্ষা করতে পারবেন। এটি পড়া ধীর এবং শক্ত। অপ্টিমাইজড সংস্করণটি কোডের সাথে অনেক বেশি কাছাকাছি যা আসলে উত্পাদনে চলবে।

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সেট করার জন্য আপনাকে একটি বিশেষ নির্দেশ ব্যবহার করতে হবে । অন্যদিকে, এমআইপিএসের জন্য আপনাকে দুটি স্বাক্ষরবিহীন পূর্ণসংখ্যার যোগফলের তুলনায় কঠোরভাবে কম কিনা তা যাচাই করা দরকার। যদি তাই হয় তবে সংযোজন উপচে পড়েছে। কমপক্ষে আপনি শর্তাধীন শাখা ছাড়াই ক্যারি বিটের মানতে অন্য একটি রেজিস্টার সেট করতে সক্ষম হন।


1
শেষ অনুচ্ছেদ: ফলাফলের উচ্চ বিটটি দেখে দু'টি স্বাক্ষরিত সংখ্যার মধ্যে কোনটি বেশি sub, এটি সনাক্ত করতে আপনার বিট ইনপুটগুলির n+1জন্য একটি বিট সাব ফলাফল প্রয়োজন n। অর্থাৎ আপনাকে বহন করতে হবে, একই প্রস্থের ফলাফলের সাইন বিট নয়। এজন্য x86 স্বাক্ষরযুক্ত শাখার শর্তগুলি এসএফ (বিট 63 বা 31) নয়, সিএফ (সম্পূর্ণ যৌক্তিক ফলাফলের বিট 64 বা 32) এর উপর ভিত্তি করে।
পিটার

1
পুনরায় ডিভোমড: এআরচ's৪ এর পদ্ধতির বিভাজন এবং এমন একটি নির্দেশনা সরবরাহ করা যা ডিগ্রি x - (a*b), ভাগফল এবং বিভাজক থেকে বাকী অংশটি গণনা করে inte (এটি বিভাগের অংশের জন্য গুণক বিপরীত ব্যবহার করে ধ্রুবক বিভাজনকারীদের জন্যও কার্যকর)। আমি আইএসএ সম্পর্কে পড়িনি যে ডিভ + মোড নির্দেশাবলী একক ডিভোড অপারেশনে ফিউজ করে; যে ঝরঝরে.
পিটার

1
পুনরায়: পতাকাগুলি: হ্যাঁ, একটি পতাকা আউটপুট হল 2 য় আউটপুট যা ওও এক্সিকিউর + রেজিস্টার-নামকরণকে কোনওভাবে পরিচালনা করতে হবে। x86 সিপিইউগুলি পূর্ণসংখ্যার ফলাফলের সাথে কয়েকটি অতিরিক্ত বিট রেখে এটিকে পরিচালনা করে যে FLAGS মান ভিত্তি করে, তাই সম্ভবত জেডএফ, এসএফ, এবং পিএফ প্রয়োজনে ফ্লাইতে উত্পন্ন হয়। আমি মনে করি এটি সম্পর্কে একটি ইন্টেল পেটেন্ট আছে। সুতরাং এটি পৃথকভাবে ট্র্যাক করতে হবে এমন আউটপুটগুলির সংখ্যা হ্রাস করে 1 এ ফিরে আসে (ইন্টেল সিপিইউগুলিতে কোনও ইউওপ 1 টিরও বেশি পূর্ণসংখ্যার নিবন্ধ লিখতে পারে না; উদাহরণস্বরূপ mul r642 টি উওপ, দ্বিতীয়টি আরডিএক্স উচ্চ অর্ধেক লিখেছেন)।
পিটার কর্ডস

1
তবে দক্ষ বর্ধিত-নির্ভুলতার জন্য পতাকাগুলি খুব ভাল। মূল সমস্যাটি হ'ল সুপারসক্যালারের ইন-অর্ডার এক্সিকিউশনটির নাম পরিবর্তন করে নেওয়া without পতাকাগুলি একটি WAW বিপত্তি (লেখার পরে লিখুন)। অবশ্যই, যুক্ত-সহ-বহন নির্দেশাবলী 3-ইনপুট এবং এটি ট্র্যাক করাও একটি উল্লেখযোগ্য সমস্যা। ইন্টেল আগে ব্রডওয়েলের সঙ্কেতমুক্ত adc, sbbএবং cmov2 uops প্রতিটি। (হাসওয়েল এফএমএর জন্য 3-ইনপুট উওপ প্রবর্তন করেছে, ব্রডওয়েল এটি পূর্ণসংখ্যাতে বাড়িয়ে দিয়েছিল))
পিটার

1
পতাকা সহ আরআইএসসি আইএসএগুলি সাধারণত পতাকা-সেটিং alচ্ছিক করে তোলে, একটি অতিরিক্ত বিট দ্বারা নিয়ন্ত্রিত। যেমন এআরএম এবং স্পার্ক এই জাতীয় পাওয়ারপিসি যথারীতি সবকিছু আরও জটিল করে তোলে: এতে 8 টি শর্ত-কোড রেজিস্টার রয়েছে (সেভ / পুনরুদ্ধার করার জন্য 32-বিট রেজিস্টারে একত্রে প্যাক করা হয়েছে) যাতে আপনি সিসি0 বা সিসি 7 বা যে কোনও কিছুতে তুলনা করতে পারেন। এবং তারপরে এবং অথবা বা শর্ত-কোডগুলি একসাথে! কোন সিআর পড়তে হবে তা শাখা এবং সেমিভ নির্দেশাবলী চয়ন করতে পারে। সুতরাং এটি আপনাকে x86 ADCX / ADOX এর মতো একযোগে ফ্লাইটে একাধিক পতাকা ডিপ চেইন রাখার ক্ষমতা দেয়। alancament.org/power%20pc.html
পিটার কর্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.