নিম্নলিখিত সমস্ত নির্দেশাবলী একই কাজ করে: %eax
শূন্যতে সেট করুন। কোন উপায়ে অনুকূল (সবচেয়ে কম মেশিন চক্রের প্রয়োজন)?
xorl %eax, %eax
mov $0, %eax
andl $0, %eax
নিম্নলিখিত সমস্ত নির্দেশাবলী একই কাজ করে: %eax
শূন্যতে সেট করুন। কোন উপায়ে অনুকূল (সবচেয়ে কম মেশিন চক্রের প্রয়োজন)?
xorl %eax, %eax
mov $0, %eax
andl $0, %eax
উত্তর:
টি এল; ডিআর সারসংক্ষেপ : xor same, same
হয় সকল CPU জন্য সবচেয়ে ভাল পছন্দ । এর চেয়ে অন্য কোনও পদ্ধতির কোনও সুবিধা নেই এবং অন্য কোনও পদ্ধতির চেয়ে এটির কমপক্ষে কিছু সুবিধা রয়েছে। এটি আনুষ্ঠানিকভাবে ইন্টেল এবং এএমডি দ্বারা প্রস্তাবিত, এবং সংকলকরা কী করে। -৪-বিট মোডে, এখনও ব্যবহার করুন xor r32, r32
, কারণ 32-বিট রেগটি উপরের 32 টি শূন্য করে । xor r64, r64
এটি একটি বাইটের অপচয়, কারণ এটির জন্য একটি রেক্স উপসর্গ প্রয়োজন।
এর চেয়েও খারাপ, সিলভারমন্ট কেবলমাত্র xor r32,r32
ডিপ ব্রেকিং হিসাবে স্বীকৃতি দেয় , 64-বিট অপারেন্ড-আকার নয়। এইভাবে এমনকি যখন কোনও রেক্স উপসর্গ এখনও প্রয়োজনীয় হয় কারণ আপনি আর 8..r15 শূন্য করছেন, ব্যবহার করুন xor r10d,r10d
নাxor r10,r10
।
জিপি-পূর্ণসংখ্যা উদাহরণ:
xor eax, eax ; RAX = 0. Including AL=0 etc.
xor r10d, r10d ; R10 = 0
xor edx, edx ; RDX = 0
; small code-size alternative: cdq ; zero RDX if EAX is already zero
; SUB-OPTIMAL
xor rax,rax ; waste of a REX prefix, and extra slow on Silvermont
xor r10,r10 ; bad on Silvermont (not dep breaking), same as r10d everywhere else because a REX prefix is still needed for r10d or r10.
mov eax, 0 ; doesn't touch FLAGS, but not faster and takes more bytes
and eax, 0 ; false dependency. (Microbenchmark experiments might want this)
sub eax, eax ; same as xor on most but not all CPUs; bad on Silvermont for example.
xor al, al ; false dep on some CPUs, not a zeroing idiom. Use xor eax,eax
mov al, 0 ; only 2 bytes, and probably better than xor al,al *if* you need to leave the rest of EAX/RAX unmodified
ভেক্টর রেজিস্টারটি জিরো করা সাধারণত সর্বোত্তমভাবে করা হয় pxor xmm, xmm
। এটি সাধারণত জিসিসি কী করে (এফপি নির্দেশাবলী ব্যবহারের আগেও)।
xorps xmm, xmm
জ্ঞান করতে পারেন। এটি এর চেয়ে এক বাইট কম খাটো pxor
, তবে xorps
ইন্টেল pxor
নেহালেমের এক্সিকিউশন পোর্ট 5 প্রয়োজন, যখন যে কোনও বন্দরে চালানো যায় (0/1/5)। (নেহালেমের 2 সি বাইপাস বিলম্বের বিলম্বতা পূর্ণসংখ্যার এবং এফপির মধ্যে সাধারণত প্রাসঙ্গিক হয় না, কারণ আউট-অফ-অর্ডার এক্সিকিউশন সাধারণত একটি নতুন নির্ভরতা শৃঙ্খলের শুরুতে এটি আড়াল করতে পারে)।
এসএনবি-পরিবারের মাইক্রোর্কিটেকচারগুলিতে, জোর-শূন্যের কোনও স্বাদ এমনকি একটি এক্সিকিউশন পোর্টের প্রয়োজন হয় না। এএমডি এবং প্রাক-নেহালেম পি 6 / কোর 2 ইন্টেল xorps
এবং pxor
এগুলি একইভাবে পরিচালনা করা হয় (ভেক্টর-পূর্ণসংখ্যার নির্দেশাবলী হিসাবে)।
কোনও 128 বি ভেক্টর নির্দেশের অ্যাভিএক্স সংস্করণটিও রেগের উপরের অংশটি শূন্য করে, তাই vpxor xmm, xmm, xmm
ওয়াইএমএম (এভিএক্স 1 / এভিএক্স 2) বা জেডএমএম (অ্যাভিএক্স 512) বা ভবিষ্যতের কোনও ভেক্টর এক্সটেনশান শূন্য করার জন্য ভাল পছন্দ। vpxor ymm, ymm, ymm
যদিও এনকোডে কোনও অতিরিক্ত বাইট নেয় না, এবং এটি ইন্টেলের সাথে একইভাবে চালায় তবে জেন 2 (2 উফস) এর আগে এএমডি-তে ধীর হয়ে যায়। AVX512 জেডএমএম জিরোয়িংয়ের জন্য অতিরিক্ত বাইটের প্রয়োজন হবে (ইভিএক্স উপসর্গের জন্য), তাই এক্সএমএম বা ওয়াইএমএম জিরোয়িংকে পছন্দ করা উচিত।
এক্সএমএম / ওয়াইএমএম / জেডএমএম উদাহরণ
# Good:
xorps xmm0, xmm0 ; smallest code size (for non-AVX)
pxor xmm0, xmm0 ; costs an extra byte, runs on any port on Nehalem.
xorps xmm15, xmm15 ; Needs a REX prefix but that's unavoidable if you need to use high registers without AVX. Code-size is the only penalty.
# Good with AVX:
vpxor xmm0, xmm0, xmm0 ; zeros X/Y/ZMM0
vpxor xmm15, xmm0, xmm0 ; zeros X/Y/ZMM15, still only 2-byte VEX prefix
#sub-optimal AVX
vpxor xmm15, xmm15, xmm15 ; 3-byte VEX prefix because of high source reg
vpxor ymm0, ymm0, ymm0 ; decodes to 2 uops on AMD before Zen2
# Good with AVX512
vpxor xmm15, xmm0, xmm0 ; zero ZMM15 using an AVX1-encoded instruction (2-byte VEX prefix).
vpxord xmm30, xmm30, xmm30 ; EVEX is unavoidable when zeroing zmm16..31, but still prefer XMM or YMM for fewer uops on probable future AMD. May be worth using only high regs to avoid needing vzeroupper in short functions.
# Good with AVX512 *without* AVX512VL (e.g. KNL / Xeon Phi)
vpxord zmm30, zmm30, zmm30 ; Without AVX512VL you have to use a 512-bit instruction.
# sub-optimal with AVX512 (even without AVX512VL)
vpxord zmm0, zmm0, zmm0 ; EVEX prefix (4 bytes), and a 512-bit uop. Use AVX1 vpxor xmm0, xmm0, xmm0 even on KNL to save code size.
দেখুন কি এক্সএএমএম রেজিস্টারগুলির সাথে এএমডি জাগুয়ার / বুলডোজার / জেন-এ ভিএক্সর্পস-জিরোয়িং দ্রুত? এবং
নাইটস ল্যান্ডিংয়ে একক বা কয়েকটি জেডএমএম নিবন্ধগুলি সাফ করার সবচেয়ে কার্যকরী উপায় কী?
সেমি-সম্পর্কিত: সব এক বিট __m256 মান সেট করার দ্রুততম উপায় এবং
1 থেকে CPU- র রেজিস্টার সেট সমস্ত বিট দক্ষতার এছাড়াও AVX512 জুড়ে k0..7
মাস্ক রেজিস্টার। এসএসই / এভিএক্স vpcmpeqd
অনেকের উপর ডিপ ব্রেক করছে (যদিও 1 টি লিখতে এখনও একটি ইউওপ দরকার), তবে জেডএমএম রেগের vpternlogd
জন্য এভিএক্স 512 এমনকি ডিপ ব্রেকিং নয়। একটি লুপের ভিতরে একটি ALU ইউওপ দিয়ে বিশেষত AVX512 দিয়ে পুনরায় তৈরি করার পরিবর্তে অন্য রেজিস্টার থেকে অনুলিপি করার বিষয়ে বিবেচনা করুন।
তবে জিরোয়িং সস্তা: কোনও লুপের ভিতরে একটি এক্সএমএম রেজি জোর-শূন্য করা সাধারণত কপি করার মতোই ভাল, কিছু এএমডি সিপিইউ (বুলডোজার এবং জেন) বাদে যা ভেক্টর রেগগুলির জন্য মুভি-অ্যালিমিনেশন রয়েছে তবে জোরের জন্য জিরো লিখতে একটি ALU ইউওপ দরকার -zeroing।
কিছু সিপিইউ sub same,same
শূন্য আইডিয়ামের মতো স্বীকৃতি দেয়xor
তবে সমস্ত সিপিইউ যে কোনও শূন্যxor
আইডিয়ামকে স্বীকৃতি দেয় । কেবলমাত্র ব্যবহার করুন xor
যাতে কোন সিপিইউ কোন শূন্য আইডিয়ামটি স্বীকৃতি দেয় তা নিয়ে আপনাকে চিন্তা করতে হবে না।
xor
(স্বীকৃত জিরোং আইডিয়াম হিসাবে ভিন্ন mov reg, 0
) এর কিছু সুস্পষ্ট এবং কিছু সূক্ষ্ম সুবিধা রয়েছে (সংক্ষিপ্ত তালিকা, তারপরে আমি সেগুলির উপরে প্রসারিত করব):
mov reg,0
। (সমস্ত সিপিইউ)ছোট মেশিন-কোড আকার (5 এর পরিবর্তে 2 বাইট) সর্বদা একটি সুবিধা: উচ্চতর কোডের ঘনত্ব কম নির্দেশ-ক্যাশে মিস করে এবং আরও ভাল নির্দেশিকা আনতে এবং সম্ভাব্যভাবে ডিকোড ব্যান্ডউইথকে নিয়ে যায়।
সুবিধার একটি মৃত্যুদন্ড ইউনিট ব্যবহার করছে না ইন্টেল SnB পরিবার microarchitectures উপর XOR জন্য ছোটখাট, কিন্তু ক্ষমতা সংরক্ষণ করে। এটি SnB বা IvB- তে গুরুত্বপূর্ণ হওয়ার সম্ভাবনা বেশি, যার কেবলমাত্র 3 টি ALU এক্সিকিউশন পোর্ট রয়েছে। হাসওয়েল এবং পরবর্তীকালে 4 টি এক্সিকিউশন পোর্ট রয়েছে mov r32, imm32
যা শিডিউলার দ্বারা নিখুঁত সিদ্ধান্ত গ্রহণের মাধ্যমে (যা সর্বদা অনুশীলনে হয় না) সহ পূর্ণসংখ্যক ALU নির্দেশনা পরিচালনা করতে পারে, এইচএসডাব্লু এখনও ঘড়ি প্রতি 4 উপ ধরে রাখতে পারে এমনকি যখন তাদের সকলের ALU প্রয়োজন হয় এক্সিকিউশন পোর্ট
আরও কিছু তথ্যের জন্য শূণ্য নিবন্ধগুলি সম্পর্কে অন্য প্রশ্নের আমার উত্তরটি দেখুন ।
ব্রুস ডসনের ব্লগ পোস্টটি যা মাইকেল পেচ লিঙ্ক করেছেন (প্রশ্নের মন্তব্যে) xor
রেজিস্ট্রেশন-নামকরণের পর্যায়ে একটি এক্সিকিউশন ইউনিট (অব্যক্ত ডোমেনের শূন্য উফস) প্রয়োজন ছাড়াই পরিচালিত হয়েছে, তবে এই সত্যটি মিস করেছেন যে এটি এখনও একটি উও সংযুক্ত ডোমেইনে। আধুনিক ইন্টেল সিপিইউগুলি প্রতি ঘড়িতে 4 টি ফিউজড-ডোমেন উওপ ইস্যু এবং অবসর নিতে পারে। সেখান থেকে প্রতি ঘড়ির সীমা 4 টি শূন্য আসে। হার্ডওয়্যারটির নামকরণের নামকরণের ক্রমবর্ধমান জটিলতা ডিজাইনের প্রস্থকে ৪ এর মধ্যে সীমাবদ্ধ করার একমাত্র কারণ। (ব্রুস কয়েকটি দুর্দান্ত ব্লগ পোস্ট লিখেছেন, যেমন তার সিরিজের মতো এফপি গণিত এবং x87 / এসএসই / গোলাকার বিষয়ে , যা আমি করি অত্যন্ত সুপারিশ).
এএমডি বুলডোজার-পরিবার সিপিইউতে , mov immediate
একই EX0 / EX1 পূর্ণসংখ্যার এক্সিকিউশন পোর্টগুলিতে চলে xor
। mov reg,reg
এজিইউ 0/1 তেও চলতে পারে তবে তা কেবল রেজিস্টার অনুলিপি করার জন্য, নকল থেকে সেট করার জন্য নয়। সুতরাং আফাইক, এএমডিতে xor
ওভারের একমাত্র সুবিধা mov
হ'ল সংক্ষিপ্ত এনকোডিং। এটি শারীরিক নিবন্ধের সংস্থানগুলিও সংরক্ষণ করতে পারে তবে আমি কোনও পরীক্ষা দেখিনি।
স্বীকৃত জিরোং আইডিয়ামগুলি সম্পূর্ণ রেজিস্টার (পি 6 এবং এসএনবি পরিবার) থেকে পৃথকভাবে আংশিক রেজিস্টারের নামকরণ করে এমন ইন্টেল সিপিইউগুলিতে আংশিক-নিবন্ধের জরিমানা এড়ায়।
xor
উপরের অংশগুলি শূন্য হিসাবে রেজিস্টারটি ট্যাগ করবে , সুতরাং xor eax, eax
/ inc al
/ inc eax
প্রাক-আইভিবি সিপিইউগুলিতে থাকা আংশিক-নিবন্ধের জরিমানা এড়িয়ে যায়। এমনকি ছাড়াও xor
, আইভিবি কেবল তখনই মার্জিং ইউওপের প্রয়োজন যখন উচ্চ 8 বিট ( AH
) সংশোধন করা হয় এবং তারপরে পুরো রেজিস্টারটি পড়া হয় এবং হাসওয়েল এমনকি এটি সরিয়ে দেয়।
অগ্নার ফগের মাইক্রোয়ার্ক গাইড থেকে, পৃষ্ঠা 98 (পেন্টিয়াম এম বিভাগ, এসএনবি সহ পরবর্তী বিভাগগুলি দ্বারা রেফারেন্স করা):
প্রসেসর একটি নিবন্ধের এক্সওআরটিকে শূন্যে নির্ধারণ করে হিসাবে স্বীকৃতি দেয়। নিবন্ধের একটি বিশেষ ট্যাগ মনে রাখে যে নিবন্ধের উচ্চ অংশটি শূন্য যাতে EAX = AL হয়। এই ট্যাগটি এমনকি একটি লুপে স্মরণ করা হয়:
; Example 7.9. Partial register problem avoided in loop xor eax, eax mov ecx, 100 LL: mov al, [esi] mov [edi], eax ; No extra uop inc esi add edi, 4 dec ecx jnz LL
(pg82 থেকে): প্রসেসরের মনে আছে যে EAX এর উপরের 24 বিটগুলি যতক্ষণ না আপনি বাধা, ভুল ধারণা বা অন্যান্য সিরিয়ালাইজিং ইভেন্ট না পান ততক্ষণ শূন্য।
যে পথ প্রদর্শক এছাড়াও নিশ্চিত করে যে এর pg82 mov reg, 0
হয় না প্রথম দিকে P6 একটি zeroing বাগ্ধারা হিসাবে স্বীকৃত, অন্তত PIII বা প্রধানমন্ত্রীর মত ডিজাইন। তারা যদি পরে সিপিইউগুলিতে এটি সনাক্ত করতে ট্রানজিস্টর ব্যয় করে তবে আমি খুব অবাক হব।
xor
পতাকা সেট করে , যার অর্থ শর্ত পরীক্ষার সময় আপনাকে সতর্কতা অবলম্বন করতে হবে। যেহেতু setcc
দুর্ভাগ্যক্রমে শুধুমাত্র 8 বিবিট গন্তব্য সহ উপলব্ধ , তাই আপনার আংশিক-নিবন্ধের জরিমানা এড়াতে সাধারণত যত্ন নেওয়া প্রয়োজন।
X / 8/64 বিটের জন্য সরস setcc r/m
-রেজিস্ট্রি 3-বিট ফিল্ডে (প্রান্তের উপায়) এনকোডযুক্ত একটি 16/32/64 বিটের জন্য x86-64 মুছে ফেলা অপকোডগুলির মধ্যে একটি (এএএম এর মতো) পুনর্নির্মাণ করা ভাল ছিল ( কিছু অন্যান্য সিঙ্গল অপারেন্ড নির্দেশাবলী এগুলিকে অপকোড বিট হিসাবে ব্যবহার করে)। তবে তারা তা করেনি এবং এটি x86-32 এর জন্য কোনওভাবেই সহায়তা করবে না।
আদর্শভাবে, আপনার উচিত xor
/ সেট পতাকা / setcc
/ সম্পূর্ণ নিবন্ধ পড়ুন:
...
call some_func
xor ecx,ecx ; zero *before* the test
test eax,eax
setnz cl ; cl = (some_func() != 0)
add ebx, ecx ; no partial-register penalty here
সমস্ত সিপিইউতে এটির সর্বোত্তম কর্মক্ষমতা রয়েছে (কোনও স্টল, মার্জিং উপস, বা মিথ্যা নির্ভরতা)।
ফ্ল্যাগ-সেটিংয়ের নির্দেশের আগে আপনি যখন জোর করতে চান না তখন বিষয়গুলি আরও জটিল হয় । যেমন আপনি একটি শর্তে শাখা করতে চান এবং তারপরে একই পতাকাগুলি থেকে অন্য শর্তে সেটসিপি করুন। উদাহরণস্বরূপ cmp/jle
, sete
এবং না হয় আপনার কোনও অতিরিক্ত রেজিস্ট্রার নেই, বা আপনি xor
না নেওয়া কোডের পথটি পুরোপুরি বাইরে রাখতে চান ।
কোনও স্বীকৃত শূণ্য প্রতিমা নেই যা পতাকাগুলিকে প্রভাবিত করে না, তাই সর্বোত্তম পছন্দ লক্ষ্য মাইক্রোআরকিটেকচারের উপর নির্ভর করে। কোর 2 এ, মার্জিং ইউওপ সন্নিবেশ করানো হতে পারে 2 বা 3 চক্রের স্টল। এটি SnB- তে সস্তা বলে মনে হচ্ছে, তবে আমি পরিমাপ করার চেষ্টা করে বেশি সময় ব্যয় করিনি। পুরানো ইন্টেল সিপিইউগুলিতে ব্যবহার mov reg, 0
/ setcc
করাতে একটি গুরুত্বপূর্ণ জরিমানা থাকবে এবং আরও নতুন ইনটেলের চেয়ে কিছুটা খারাপ হতে পারে।
ব্যবহার setcc
/ movzx r32, r8
সম্ভবত ইন্টেল P6 & SnB পরিবারের জন্য সেরা বিকল্প নেই যদি আপনি করতে পারেন না XOR-জিরো পতাকা-সেটিং নির্দেশ এগিয়ে। জোর-শূন্যের পরে পরীক্ষার পুনরাবৃত্তি করার চেয়ে এটি ভাল। (এমনকি sahf
/ lahf
বা pushf
/ বিবেচনা করবেন না popf
)। আইভিবি নির্মূল করতে পারে movzx r32, r8
(অর্থাত্ এক্সওর-জিরোয়িংয়ের মতো কোনও এক্সিকিউশন ইউনিট বা বিলম্ব না করে রেজিস্টার-নামকরণের মাধ্যমে এটি পরিচালনা করুন)। হ্যাসওয়েল এবং পরে কেবল নিয়মিত mov
নির্দেশাবলী অপসারণ করে, তাই movzx
একটি এক্সিকিউশন ইউনিট নেয় এবং শূন্য-বিন্দু থাকে, পরীক্ষা / setcc
/ movzx
আরও xor
/ টেস্ট / এর চেয়ে খারাপ করে তোলে setcc
, তবে তবুও কমপক্ষে টেস্ট / mov r,0
/ setcc
(এবং পুরানো সিপিইউগুলিতে আরও ভাল) হিসাবে ভাল ।
এএমডি / পি 4 / সিলভারমন্টে প্রথমে শূন্যের সাথে setcc
/ ব্যবহার movzx
করা খারাপ, কারণ তারা সাব-রেজিস্টারগুলির জন্য পৃথকভাবে ডিপগুলি ট্র্যাক করে না। নিবন্ধকের পুরানো মানটিতে একটি মিথ্যা অবদান থাকবে। ব্যবহার mov reg, 0
/ setcc
zeroing / নির্ভরতা অবিচ্ছিন্ন জন্য সম্ভবত শ্রেষ্ঠ বিকল্প যখন xor
/ পরীক্ষা / setcc
একটি বিকল্প হয় না।
অবশ্যই, যদি আপনার setcc
8 টি বিটের চেয়ে বেশি বিস্তৃত আকারের আউটপুট প্রয়োজন না হয় তবে আপনার কোনও কিছুর শূন্য করার দরকার নেই। তবে, আপনি সম্প্রতি একটি দীর্ঘ নির্ভরতা শৃঙ্খলের অংশ ছিল এমন একটি রেজিস্টার বাছাই করে পি 6 / এসএনবি ব্যতীত সিপিইউগুলিতে মিথ্যা নির্ভরতা সম্পর্কে সতর্ক থাকুন। (এবং আপনি যদি এমন কোনও ফাংশন কল করেন যা আপনি যে অংশের অংশটি ব্যবহার করছেন নিবন্ধটি সংরক্ষণ / পুনরুদ্ধার করতে পারে তবে আংশিক রেগ স্টল বা অতিরিক্ত উওপ সৃষ্টি করার বিষয়ে সতর্ক থাকুন))
and
তাত্ক্ষণিক শূন্যের সাথে আমি যে সিপিইউগুলিতে সচেতন সেগুলির পুরানো মানের তুলনায় স্বাধীন হিসাবে বিশেষ হিসাবে চিহ্নিত হয় না, তাই এটি নির্ভরতা শৃঙ্খলাগুলি ভাঙে না। এর কোনও সুবিধা নেই xor
এবং অনেক অসুবিধাও রয়েছে।
যখন আপনি এটি শুধুমাত্র microbenchmarks লেখার জন্য দরকারী চান একটি লেটেন্সি পরীক্ষা অংশ হিসাবে একটি নির্ভরতা কিন্তু zeroing এবং যোগ করে একটি পরিচিত মান তৈরি করতে চান।
মাইক্রোকার্টের বিশদগুলির জন্য http://agner.org/optimize/ দেখুন , যা জিরোং আইডিয়ামগুলি নির্ভরতা ব্রেকিং হিসাবে স্বীকৃত রয়েছে (যেমনsub same,same
তবে সমস্ত সিপিইউ নয়, সকলের xor same,same
কাছে স্বীকৃত)) mov
পুরানো মানটির উপর নির্ভরশীলতা শৃঙ্খলা ভেঙে দেয় নিবন্ধের (উত্সের মান নির্বিশেষে শূন্য বা না, কারণ এটি কিভাবে mov
কাজ করে) xor
কেবলমাত্র বিশেষ ক্ষেত্রে ক্ষেত্রে নির্ভরতা শৃঙ্খলাগুলি ভেঙে দেয় যেখানে এসসিআর এবং ডেস্ট একই রেজিস্টার, যার কারণে বিশেষভাবে স্বীকৃত নির্ভরতা-ব্রেকারগুলির mov
তালিকা থেকে বাদ পড়ে । (এছাড়াও, কারণ এটি অন্যান্য সুবিধাগুলি বহন করে শূণ্য প্রতিমা হিসাবে স্বীকৃত নয়))
মজার বিষয় হল, প্রাচীনতম পি 6 ডিজাইন (পেন্টিয়াম তৃতীয় মাধ্যমে পিপিও) তা করেনি চিনতে xor
শুধুমাত্র অর্ধ-রেজিস্টার স্টল এড়ানো উদ্দেশ্যে একটি zeroing বাগ্ধারা, একটি নির্ভরতা ব্রেকার যেমন -zeroing ব্যবহার করে, তাই কিছু কিছু ক্ষেত্রে এটা মূল্য ছিল উভয় mov
এবং তারপর xor
এই ডিপটি ভাঙ্গতে এবং সেই সাথে আবার শূন্যের জন্য জোর করে + অভ্যন্তরীণ ট্যাগ বিট সেট করুন যে উচ্চ বিটগুলি শূন্য তাই EAX = AX = AL।
অ্যাগনার ফাগের উদাহরণ দেখুন 6.17। তার মাইক্রোয়ার্ক পিডিএফ এ। তিনি বলেছেন এটি পি 2, পি 3, এবং এমনকি (প্রারম্ভিক?) প্রধানমন্ত্রীকেও প্রযোজ্য। লিঙ্কযুক্ত ব্লগ পোস্টে একটি মন্তব্য বলেছে যে এটি কেবলমাত্র পিপ্রোই ছিল যাঁর এই তদারকি ছিল, তবে আমি কাটমাই পিআইআইআই, এবং @ ফানেল একটি পেন্টিয়াম এম তে পরীক্ষা করেছি এবং আমরা দুজনেই দেখেছি যে এটি কোনও বিলম্বের জন্য নির্ভরতা ভঙ্গ করেনি found -বাউন্ড imul
চেইন দুর্ভাগ্যক্রমে এটি অ্যাগনার ফগের ফলাফল নিশ্চিত করে।
যদি এটি সত্যিই আপনার কোডটিকে সুন্দর করে তোলে বা নির্দেশাবলীর সংরক্ষণ করে তবে অবশ্যই শূন্যের সাথে শূন্য করুন mov
হোন যে যতক্ষণ আপনি কোডের আকার ব্যতীত কোনও পারফরম্যান্স সমস্যার সমাধান না করেন ততক্ষণ পতাকাগুলি স্পর্শ করা এড়াতে । ক্লাববারিং ফ্ল্যাগগুলি এড়ানো না হওয়াই একমাত্র বুদ্ধিমান কারণ xor
, তবে কখনও কখনও আপনি অতিরিক্ত রেজিস্টার থাকলে ফ্ল্যাগ সেট করে এমন জিনিসটির আগে আপনি জিরো-শূন্য করতে পারেন।
mov
-জিরো এর চেয়ে আগেরের setcc
তুলনায় বিলম্বের পক্ষে ভাল movzx reg32, reg8
(আপনি যখন অন্য রেজিস্টারগুলি বেছে নিতে পারেন তখন ইন্টেলের বাদে), তবে কোডের আকার আরও খারাপ।
mov reg, src
ওও সিপিইউগুলির জন্য ডিপ চেইনগুলিও ভেঙে ফেলেছে (এসসিআর ইমিও 32 [mem]
, বা অন্য কোনও নিবন্ধক নির্বিশেষে )। এই নির্ভরতা-ভাঙ্গা অপ্টিমাইজেশন ম্যানুয়ালগুলিতে উল্লেখ করা যায় না কারণ এটি কোনও বিশেষ ক্ষেত্রে নয় যা তখনই ঘটে যখন এসসিআর এবং ডেস্ট একই রেজিস্টার হয়। এটি সর্বদা এমন নির্দেশাবলীর জন্য ঘটে যা তাদের ভাগ্যের উপর নির্ভর করে না। ( popcnt/lzcnt/tzcnt
গন্তব্যস্থলে মিথ্যা অধিগ্রহণের জন্য ইন্টেলের বাস্তবায়ন ব্যতীত )
mov
এলিমিনেশন নিখরচায় নয়, কেবল জিরো বিলম্ব। "একটি এক্সিকিউশন পোর্ট না নেওয়া" অংশটি সাধারণত গুরুত্বপূর্ণ নয়। ফিউজড-ডোমেন থ্রুপুট সহজেই বাধা হতে পারে, এসএসপি। মিশ্রণে লোড বা স্টোর সহ।
xor r64, r64
একটি বাইট নষ্ট না। যেমনটি আপনি বলেছেন xor r32, r32
সেরা পছন্দ বিশেষত কেএনএল এর সাথে। যদি আপনি আরও পড়তে চান তবে এই মাইক্র্যাচ ম্যানুয়ালটিতে বিভাগের 15.7 বিভাগ "স্বাধীনতার বিশেষ মামলাগুলি" দেখুন।