কেন 86২-বিট নিবন্ধের উপর x86-64 নির্দেশাবলী পূর্ণ 64৪-বিট নিবন্ধের উপরের অংশটি শূন্য করে?


118

ইন ইন্টেল সারগ্রন্থ এর x86-64 'ট্যুর , আমি পড়তে

সম্ভবত সবচেয়ে অবাক করা তথ্য হ'ল কোনও নির্দেশ যেমন MOV EAX, EBXস্বয়ংক্রিয়ভাবে RAXনিবন্ধের উপরের 32 বিটগুলিকে শূন্য করে ।

একই উত্সে উদ্ধৃত ইনটেল ডকুমেন্টেশন (৩.৪.১.১ ম্যানুয়াল বেসিক আর্কিটেকচারে -৪-বিট মোডে সাধারণ-উদ্দেশ্য রেজিস্টারস) আমাদের বলে:

  • গন্তব্য সাধারণ-উদ্দেশ্য রেজিস্ট্রারে destination৪-বিট অপারেশনগুলি একটি -৪-বিটের ফলাফল উত্পন্ন করে।
  • 32-বিট অপারেশনগুলি 32-বিট ফলাফল উত্পন্ন করে, গন্তব্য সাধারণ-উদ্দেশ্য রেজিস্ট্রারে শূন্য-প্রসারিত 64৪-বিটের ফলাফল পর্যন্ত।
  • 8-বিট এবং 16-বিট অপারেশনগুলি একটি 8-বিট বা 16-বিট ফলাফল উত্পন্ন করে। গন্তব্য সাধারণ-উদ্দেশ্য নিবন্ধের উপরের 56 বিট বা 48 বিট (যথাক্রমে) অপারেশন দ্বারা পরিবর্তন করা হয় না। যদি 8-বিট বা 16-বিটের ক্রিয়াকলাপের ফলাফলটি 64-বিট ঠিকানা গণনার জন্য উদ্দিষ্ট হয় তবে স্পষ্টভাবে সম্পূর্ণ 64-বিটগুলিতে নিবন্ধকে সাইন ইন-প্রসারিত করুন।

X86-32 এবং x86-64 সমাবেশে, 16 বিট নির্দেশাবলী

mov ax, bx

এই ধরণের "অদ্ভুত" আচরণটি প্রদর্শন করবেন না যে ইক্সের উপরের শব্দটি শূন্য।

এইভাবে: এই আচরণটি চালু হওয়ার কারণ কী? প্রথম নজরে এটি অযৌক্তিক বলে মনে হচ্ছে (তবে কারণটি হতে পারে যে আমি x86-32 সমাবেশের স্ফূরণে অভ্যস্ত)।


16
যদি আপনি "আংশিক নিবন্ধের স্টল" এর জন্য গুগল হন, তবে তারা যে সমস্যাটি এড়াতে চেয়েছিলেন (প্রায় অবশ্যই) সমস্যা সম্পর্কে বেশ কিছুটা তথ্য পাবেন।
জেরি কফিন


4
শুধু "সর্বাধিক" নয়। আফাইক, গন্তব্যস্থল সহ সমস্ত নির্দেশনা r32মার্জ হওয়ার পরিবর্তে উচ্চমাত্রায় 32-এর শূন্য করে। উদাহরণস্বরূপ, কিছু এসেমব্লাররা একটি আরএক্স সংরক্ষণ করে এর pmovmskb r64, xmmসাথে প্রতিস্থাপন করবে pmovmskb r32, xmm, কারণ 64 বিট গন্তব্য সংস্করণটি একই রকম আচরণ করে। যদিও ম্যানুয়ালটির অপারেশন বিভাগটি 32/64 বিট গন্তব্য এবং 64/128/256 বি উত্সের 6 টি সংমিশ্রণ পৃথকভাবে তালিকাবদ্ধ করে, r32 ফর্মের অন্তর্নিহিত শূন্য-এক্সটেনশানটি r64 ফর্মের সুস্পষ্ট শূন্য-বর্ধনের নকল করে। আমি এইচডাব্লু বাস্তবায়ন সম্পর্কে কৌতূহলী ...
পিটার কর্ডেস

2
@ হ্যান্সপাস্যান্ট, বিজ্ঞপ্তিটি শুরু হয়।
kchoi

1
সম্পর্কিত: xor eax,eaxবা xor r8d,r8dশূন্য র্যাক্স বা আর 8 (রাক্সের জন্য একটি রেক্স উপসর্গ সংরক্ষণ করা, এবং সিলভারমন্টে 64৪-বিট এক্সওর এমনকি বিশেষভাবে পরিচালনা করা যায় না) সেরা উপায় way সম্পর্কিত: হাসওয়েল / স্কাইলেকে আংশিক নিবন্ধগুলি কীভাবে সম্পাদন করে? AL- কে রাকসের উপর মিথ্যা নির্ভরতা রয়েছে বলে মনে হয় এবং এএইচ অসঙ্গত
পিটার

উত্তর:


97

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

এইভাবে আপনি time৪-বিট মোডে 32-বিট মানগুলি ব্যবহার করে দ্রুত কোডটি লিখতে পারেন সার্বক্ষণিকভাবে নির্ভরশীলতাগুলি স্পষ্টভাবে ভেঙে না ফেলে। এই আচরণ ব্যতীত, -৪-বিট মোডে প্রতিটি 32-বিট নির্দেশাবলীর আগে এমন কিছু ঘটতে অপেক্ষা করতে হবে, যদিও এটি উচ্চ অংশটি প্রায় কখনও ব্যবহৃত হত না। (-৪ int-বিট তৈরি করা ক্যাশে পদচিহ্ন এবং মেমরি ব্যান্ডউইদথকে নষ্ট করবে; x86-64 সবচেয়ে দক্ষতার সাথে 32 এবং 64-বিট অপারেন্ড আকারগুলি সমর্থন করে )

8 এবং 16-বিট অপারেন্ড আকারের জন্য আচরণটি আজব। নির্ভরতা পাগলামি একটি কারণ যা এখন 16-বিট নির্দেশাবলী এড়ানো হয়েছে। x86-64 এটি 886-বিটের জন্য 8086 এবং 16-বিটের জন্য 386 থেকে উত্তরাধিকার সূত্রে পেয়েছে এবং 8-16-বিট রেজিস্টারগুলি 32-বিট মোডে যেমন করে 64-বিট মোডে একইভাবে কাজ করার সিদ্ধান্ত নিয়েছে।


আরও দেখুন জিসিসি কেন আংশিক নিবন্ধগুলি ব্যবহার করে না? কীভাবে 8 এবং 16-বিট আংশিক রেজিস্টারগুলিতে (এবং পরবর্তী নিবন্ধের পরবর্তী পাঠাগারগুলি) সত্য সিপিইউ দ্বারা পরিচালিত হয় তার ব্যবহারিক বিশদের জন্য।


8
আমি এটিকে অদ্ভুত বলে মনে করি না, আমার ধারণা তারা খুব বেশি ভাঙতে চায় না এবং সেখানে পুরানো আচরণটি রেখেছিল kept
অ্যালেক্সি ফ্রুঞ্জ

5
@ অ্যালেক্স যখন তারা 32 বিবিট মোড প্রবর্তন করলেন তখন উচ্চ অংশের জন্য কোনও পুরানো আচরণ ছিল না। এর আগে কোনও উচ্চ অংশ ছিল না .. অবশ্যই এর পরে আর পরিবর্তন করা যায় না।
হারানো

1
আমি 16-বিট অপারেশন সম্পর্কে বলছিলাম, শীর্ষ বিটগুলি কেন সেই ক্ষেত্রে শূন্য হয় না। তারা নন-64-বিট মোডে নেই। এবং এটি 64৪-বিট মোডেও রাখা হয়েছে।
আলেক্সি ফ্রুঞ্জ

3
আমি আপনার "16 বিট নির্দেশাবলীর জন্য আচরণটি অদ্ভুত একটি" হিসাবে ব্যাখ্যা করেছি "কারণ এটি আশ্চর্যজনক যে শূন্য-এক্সটেনশনটি -৪-বিট মোডে ১--বিট অপারেন্ডগুলির সাথে ঘটে না"। অতএব আরও ভাল সামঞ্জস্যের জন্য 64৪-বিট মোডে এটি একইভাবে রাখার বিষয়ে আমার মন্তব্য।
আলেক্সি ফ্রুঞ্জ

8
@ অ্যালেক্স ওহ আমি দেখছি। ঠিক আছে. আমি এটিকে দৃষ্টিকোণ থেকে অদ্ভুত বলে মনে করি না। "পিছনে ফিরে তাকানো থেকে, সম্ভবত এটি এত ভাল ধারণা ছিল না" - দৃষ্টিভঙ্গি। অনুমান করুন আমার পরিষ্কার হওয়া উচিত ছিল :)
হারোলে

9

এটি কেবল নির্দেশাবলী এবং নির্দেশিকাতে স্থান সংরক্ষণ করে। আপনি বিদ্যমান (32-বিট) নির্দেশাবলীর সাহায্যে ছোট তাত্ক্ষণিক মানগুলি 64-বিট রেজিস্ট্রারে স্থানান্তর করতে পারেন।

এটি আপনাকে MOV RAX, 42কখন MOV EAX, 42ব্যবহার করা যেতে পারে তার জন্য 8 বাইট মানগুলি এনকোড করা থেকে বাঁচায় ।

8 এবং 16 বিট অপ্সের জন্য এই অপ্টিমাইজেশানটি ততটা গুরুত্বপূর্ণ নয় (কারণ সেগুলি ছোট) এবং সেখানে নিয়মগুলি পরিবর্তন করাও পুরানো কোডটি ভেঙে দেবে।


7
যদি এটি সঠিক হয় তবে এটি 0 টি বাড়ানোর পরিবর্তে সাইন-এক্সটেন্ড করার পক্ষে কী আরও বেশি বোঝাপড়া করে না?
ড্যামিয়েন_এ_বিশ্বাসীরা

16
হার্ডওয়্যারেও সাইন এক্সটেনশন ধীর hardware জিরো এক্সটেনশনটি যে পরিমাণ গণনা নিম্ন অর্ধেক উত্পাদন করে তার সাথে সমান্তরালভাবে করা যেতে পারে, তবে নিম্ন অর্ধেকটি গণনা করা না হওয়া পর্যন্ত সাইন এক্সটেনশন করা যায় না (কমপক্ষে সাইন ইন)।
জেরি কফিন

13
আরেকটি সম্পর্কিত কৌশলটি ব্যবহার করা XOR EAX, EAXকারণ XOR RAX, RAXএকটি রেক্স উপসর্গের প্রয়োজন হবে।
নীল

3
@ নুবোক: অবশ্যই, তারা মুভিজএক্স / মুভেক্সএক্সের একটি এনকোডিং যুক্ত করতে পারত যা তাত্ক্ষণিক যুক্তি দেখায়। বেশিরভাগ সময় উপরের বিটগুলি শূন্য করা আরও সুবিধাজনক, তাই আপনি একটি অ্যারে সূচক হিসাবে একটি মান ব্যবহার করতে পারেন (কারণ সমস্ত কার্যকরিকে একটি কার্যকর ঠিকানায় একই আকার থাকতে হয়: [rsi + edx]অনুমোদিত নয়)। অবশ্যই মিথ্যা নির্ভরতা / আংশিক-নিবন্ধের স্টলগুলি এড়ানো (অন্য উত্তর) আরেকটি বড় কারণ।
পিটার কর্ডেস

4
এবং সেখানে নিয়ম পরিবর্তন করলে পুরানো কোডও ভেঙে যায়। পুরানো কোড যেভাবেই ;৪-বিট মোডে চলতে পারে না (উদাহরণস্বরূপ 1-বাইট ইনক / ডেস্কটি REX উপসর্গ); এটি অপ্রাসঙ্গিক। এক্স 86 এর ওয়ার্টগুলি পরিষ্কার না করার কারণটি লং মোড এবং কমপ্যাট / লেগ্যাসি মোডের মধ্যে কম পার্থক্য, সুতরাং মোডের উপর নির্ভর করে কম নির্দেশাবলী আলাদাভাবে ডিকোড করতে হবে। এএমডি জানত না যে এএমডি on৪ টি ধরতে চলেছে, এবং দুর্ভাগ্যক্রমে খুব রক্ষণশীল ছিল সুতরাং এটি সমর্থন করতে কম ট্রানজিস্টর লাগবে। দীর্ঘমেয়াদী, এটি সংক্ষিপ্ত হত যদি সংকলক এবং মানবেরা remember৪-বিট মোডে কোন জিনিসগুলি আলাদাভাবে কাজ করে তা মনে রাখতে পারত।
পিটার কর্ডেস

1

শূন্যটি b৪ বিট পর্যন্ত প্রসারিত না করে এর অর্থ হ'ল কোনও নির্দেশিকা পড়ার raxজন্য এর raxঅপারেন্ডের জন্য 2 নির্ভরতা থাকবে (যে নির্দেশনাটি লিখেছেন eaxএবং যে নির্দেশটি raxআগে লিখেছেন ), এর অর্থ এই যে 1) আরওবিতে প্রবেশের জন্য প্রবেশাধিকারী থাকতে হবে একক অপারেন্ডের একাধিক নির্ভরতা, যার অর্থ হ'ল আরওবি আরও যুক্তি এবং ট্রানজিস্টারের প্রয়োজন হবে এবং আরও স্থান গ্রহণ করবে, এবং মৃত্যুদন্ড কার্যকর করতে বয়সগুলি গ্রহণ করতে পারে এমন অপ্রয়োজনীয় দ্বিতীয় নির্ভরতার জন্য ধীর অপেক্ষা করবে; বা বিকল্প 2), যা আমি অনুমান করছি 16 বিট নির্দেশাবলীর সাথে ঘটেছিল, বরাদ্দ পর্যায়ে সম্ভবত স্টল রয়েছে (অর্থাত্ যদি র‌্যাটের একটি axলেখার জন্য সক্রিয় বরাদ্দ থাকে এবং একটি eaxপাঠ্য প্রদর্শিত হয়, তবে এটি axলেখার অবসর না হওয়া পর্যন্ত স্টল করে )।

mov rdx, 1
mov rax, 6
imul rax, rdx
mov rbx, rax
mov eax, 7 //retires before add rax, 6
mov rdx, rax // has to wait for both imul rax, rdx and mov eax, 7 to finish before dispatch to the execution units, even though the higher order bits are identical anyway

শূন্য না বাড়ানোর একমাত্র সুবিধা হ'ল উচ্চতর অর্ডার বিটগুলি raxঅন্তর্ভুক্ত করা নিশ্চিত করা, উদাহরণস্বরূপ, যদি এটিতে প্রাথমিকভাবে 0xffffffffffffffff থাকে তবে ফলাফলটি 0xffffffff00000007 হতে পারে, তবে আইএসএর পক্ষে এত ব্যয় করে এই গ্যারান্টি তৈরি করার খুব কম কারণ রয়েছে এবং এটি সম্ভবত শূন্য এক্সটেনশনের সুবিধার জন্য আরও বেশি প্রয়োজন বলে বেশি সম্ভাবনা রয়েছে, তাই এটি কোডের অতিরিক্ত লাইনটি সংরক্ষণ করে mov rax, 0। গ্যারান্টি দিয়ে এটি সর্বদা শূন্য 64৪ বিট পর্যন্ত প্রসারিত হবে, সংকলকগণ এই স্বতঃস্ফূর্ততার সাথে মাথায় রেখেই কাজ করতে পারে mov rdx, rax, raxকেবলমাত্র তার একক নির্ভরতার জন্য অপেক্ষা করতে হবে, অর্থাত্ এটি কার্যকরভাবে কার্যকর হওয়া ইউনিটগুলি মুক্ত করে দ্রুত কার্যকর হতে পারে এবং অবসর নিতে পারে free তদ্ব্যতীত, এটি আরএক্স বাইটের প্রয়োজনীয়তা ছাড়াই xor eax, eaxশূন্যের মতো আরও দক্ষ শূন্য প্রতিমাগুলির জন্যও অনুমতি দেয় rax


স্কাইলেকে আংশিক-পতাকা কমপক্ষে সিএফ বনাম স্প্যাজোর যে কোনও জন্য আলাদা ইনপুট রেখে কাজ করে। (সুতরাং cmovbe2 উওপ তবে cmovb1)। তবে কোনও সিপিইউ যে কোনও আংশিক-নিবন্ধভুক্ত নামকরণ করে তা আপনার পরামর্শ মতো করে না। এর পরিবর্তে তারা আংশিক রেগের পুরো নাম থেকে আলাদা নামকরণ করা হলে (অর্থাত "নোংরা") uোকানো হয় op দেখুন কেন জিসিসি আংশিক নিবন্ধগুলি ব্যবহার করে না? এবং হাসওয়েল / স্কাইলেকে আংশিক নিবন্ধগুলি কীভাবে সম্পাদন করে? AL- কে রাক্সের উপর মিথ্যা নির্ভরতা রয়েছে বলে মনে হয় এবং এএইচ অসঙ্গত
পিটার কর্ডেস

পি 6-পরিবারের সিপিইউগুলি মার্জিং ইউওপি (কোর 2 / নেহালিম) sertোকানোর জন্য 3 ডলার চক্রের জন্য থামিয়ে দেয়, বা এর আগে পি 6-পরিবার (প্রধানমন্ত্রী, পিআইআইআই, পিআইআই, পিপ্রো) কেবল (কমপক্ষে?) ~ 6 চক্রের জন্য স্টল করে। সম্ভবত এটি আপনি 2-এ প্রস্তাবিত মত, স্থায়ী / আর্কিটেকচারাল রেজিস্টার ফাইলে রাইটব্যাকের মাধ্যমে সম্পূর্ণ রেগ মান উপলব্ধ হওয়ার অপেক্ষা করে।
পিটার কর্ডেস

@ পিটারকার্ডস ওহ, আমি কমপক্ষে আংশিক পতাকা স্টলের জন্য উপগুলি মার্জ করার বিষয়ে জানতাম। বোধগম্য হয় তবে আমি কীভাবে এক মিনিটের জন্য এটি কাজ করে তা ভুলে গেছি; এটি একবার ক্লিক করলেও আমি নোট তৈরি করতে ভুলে গেছি
লুইস কেলসি

@ পিটারকর্ডস মাইক্রোআরকিটেকচার.পিডিএফ: This gives a delay of 5 - 6 clocks. The reason is that a temporary register has been assigned to AL to make it independent of AH. The execution unit has to wait until the write to AL has retired before it is possible to combine the value from AL with the value of the rest of EAXআমি 'মার্জিং উওপ'-এর একটি উদাহরণ পাই না যা এটি সমাধান করতে ব্যবহৃত হবে, যদিও আংশিক পতাকা স্টলের জন্য একই ছিল
লুইস কেলসি

ডান, প্রারম্ভিক পি 6 কেবল রাইটব্যাক পর্যন্ত স্টল করে। কোর 2 এবং নেহালেম পরে / আগে কোনও মার্জিং ইউওপ ?োকান? শুধুমাত্র একটি স্বল্প সময়ের জন্য সামনের প্রান্ত স্টলিং। স্যান্ডিব্রিজে স্টল না করে ইউপ মার্জ করে .োকান। (তবে এএইচ-মার্জিং নিজে থেকেই একটি চক্রের মধ্যে জারি করতে হবে, যখন AL মার্জিং একটি সম্পূর্ণ গোষ্ঠীর অংশ হতে পারে)) হাসওয়েল / এসকেএল mov al, [mem]একেবারে RAX থেকে আলাদাভাবে AL এর নাম পরিবর্তন করে না, তাই একটি মাইক্রো-ফিউজড লোড + ALU- মার্জ করুন, কেবলমাত্র এএইচে নামকরণ এবং এএইচ-মার্জ করা উওপ এখনও একা ইস্যু করে। এই সিপিইউগুলিতে আংশিক-পতাকা মার্জিংয়ের পদ্ধতিগুলি পৃথক হয়, যেমন কোর 2 / নেহালেম এখনও আংশিক-রেগের বিপরীতে আংশিক-পতাকাগুলির জন্য স্টল করে।
পিটার কর্ডেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.