X86 সমাবেশে শূন্যে একটি রেজিস্টার সেট করার সর্বোত্তম উপায় কী: xor, Mov বা এবং?


119

নিম্নলিখিত সমস্ত নির্দেশাবলী একই কাজ করে: %eaxশূন্যতে সেট করুন। কোন উপায়ে অনুকূল (সবচেয়ে কম মেশিন চক্রের প্রয়োজন)?

xorl   %eax, %eax
mov    $0, %eax
andl   $0, %eax


উত্তর:


222

টি এল; ডিআর সারসংক্ষেপ : 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।


বিভিন্ন uarches এ জোর এর মতো আইডিয়মগুলি শূন্য করার বিষয়ে বিশেষ

কিছু সিপিইউ sub same,sameশূন্য আইডিয়ামের মতো স্বীকৃতি দেয়xor তবে সমস্ত সিপিইউ যে কোনও শূন্যxor আইডিয়ামকে স্বীকৃতি দেয় । কেবলমাত্র ব্যবহার করুন xorযাতে কোন সিপিইউ কোন শূন্য আইডিয়ামটি স্বীকৃতি দেয় তা নিয়ে আপনাকে চিন্তা করতে হবে না।

xor(স্বীকৃত জিরোং আইডিয়াম হিসাবে ভিন্ন mov reg, 0) এর কিছু সুস্পষ্ট এবং কিছু সূক্ষ্ম সুবিধা রয়েছে (সংক্ষিপ্ত তালিকা, তারপরে আমি সেগুলির উপরে প্রসারিত করব):

  • এর চেয়ে ছোট কোড-আকার mov reg,0। (সমস্ত সিপিইউ)
  • পরবর্তী কোডের জন্য আংশিক-নিবন্ধের জরিমানা এড়ানো। (ইন্টেল পি 6-পরিবার এবং এসএনবি-পরিবার)।
  • শক্তি প্রয়োগ করা এবং কার্যকরকরণের সংস্থানগুলি মুক্ত করে একটি এক্সিকিউশন ইউনিট ব্যবহার করে না। (ইনটেল এসএনবি-পরিবার)
  • ছোট ইউওপ (কোনও তাত্ক্ষণিক ডেটা নেই) আশেপাশের নির্দেশাবলীর প্রয়োজনে instructionsণ নেওয়ার জন্য উওপ ক্যাশে-লাইনে ঘর ছেড়ে দেয়। (ইনটেল এসএনবি-পরিবার)।
  • দৈহিক নিবন্ধের ফাইলে প্রবেশাধিকারগুলি ব্যবহার করে না । (ইনটেল এসএনবি-পরিবার (এবং পি 4) কমপক্ষে, সম্ভবত এএমডি পাশাপাশি তারা আরএলবিতে ইন্টেল পি 6-পরিবারের মাইক্রোর্কিটেকচারের মতো রেজিস্ট্রার স্টেট রাখার পরিবর্তে অনুরূপ পিআরএফ ডিজাইন ব্যবহার করে))

ছোট মেশিন-কোড আকার (5 এর পরিবর্তে 2 বাইট) সর্বদা একটি সুবিধা: উচ্চতর কোডের ঘনত্ব কম নির্দেশ-ক্যাশে মিস করে এবং আরও ভাল নির্দেশিকা আনতে এবং সম্ভাব্যভাবে ডিকোড ব্যান্ডউইথকে নিয়ে যায়।


সুবিধার একটি মৃত্যুদন্ড ইউনিট ব্যবহার করছে না ইন্টেল SnB পরিবার microarchitectures উপর XOR জন্য ছোটখাট, কিন্তু ক্ষমতা সংরক্ষণ করে। এটি SnB বা IvB- তে গুরুত্বপূর্ণ হওয়ার সম্ভাবনা বেশি, যার কেবলমাত্র 3 টি ALU এক্সিকিউশন পোর্ট রয়েছে। হাসওয়েল এবং পরবর্তীকালে 4 টি এক্সিকিউশন পোর্ট রয়েছে mov r32, imm32যা শিডিউলার দ্বারা নিখুঁত সিদ্ধান্ত গ্রহণের মাধ্যমে (যা সর্বদা অনুশীলনে হয় না) সহ পূর্ণসংখ্যক ALU নির্দেশনা পরিচালনা করতে পারে, এইচএসডাব্লু এখনও ঘড়ি প্রতি 4 উপ ধরে রাখতে পারে এমনকি যখন তাদের সকলের ALU প্রয়োজন হয় এক্সিকিউশন পোর্ট

আরও কিছু তথ্যের জন্য শূণ্য নিবন্ধগুলি সম্পর্কে অন্য প্রশ্নের আমার উত্তরটি দেখুন ।

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


এএমডি বুলডোজার-পরিবার সিপিইউতে , mov immediateএকই EX0 / EX1 পূর্ণসংখ্যার এক্সিকিউশন পোর্টগুলিতে চলে xormov 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/ setcczeroing / নির্ভরতা অবিচ্ছিন্ন জন্য সম্ভবত শ্রেষ্ঠ বিকল্প যখন xor/ পরীক্ষা / setccএকটি বিকল্প হয় না।

অবশ্যই, যদি আপনার setcc8 টি বিটের চেয়ে বেশি বিস্তৃত আকারের আউটপুট প্রয়োজন না হয় তবে আপনার কোনও কিছুর শূন্য করার দরকার নেই। তবে, আপনি সম্প্রতি একটি দীর্ঘ নির্ভরতা শৃঙ্খলের অংশ ছিল এমন একটি রেজিস্টার বাছাই করে পি 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(আপনি যখন অন্য রেজিস্টারগুলি বেছে নিতে পারেন তখন ইন্টেলের বাদে), তবে কোডের আকার আরও খারাপ।


7
বেশিরভাগ গাণিতিক নির্দেশাবলী ওপি আর, এস একটি আউট অফ অর্ডার সিপিইউ দ্বারা বাধ্যতামূলকভাবে রেজিস্টার আর এর পূর্ববর্তী নির্দেশাবলী পূরণ করার জন্য অপেক্ষা করতে হবে যাতে লক্ষ্য হিসাবে রেজিস্টার আর; এটি একটি ডেটা নির্ভরতা। মূল বক্তব্যটি হ'ল এক্সওর আর, আর-এর মুখোমুখি হওয়ার সময় ইন্টেল / এএমডি চিপগুলিতে রেজিস্টার আর-এর জন্য ডেটা-নির্ভর-নির্ভরতাগুলি ভাঙার জন্য বিশেষ হার্ডওয়্যার থাকে এবং অন্যান্য রেজিস্টার শূন্য নির্দেশাবলীর জন্য প্রয়োজনীয়ভাবে তা করা হয় না। এর অর্থ XOR নির্দেশটি তাত্ক্ষণিকভাবে কার্যকর করার জন্য নির্ধারিত হতে পারে এবং এজন্য ইন্টেল / এএমডি এটি ব্যবহারের পরামর্শ দেয়।
ইরা

3
@ ইরাক্যাক্সটার: হ্যাঁ, এবং কোনও বিভ্রান্তি এড়াতে (কারণ আমি এসও তে এই ভুল ধারণাটি দেখেছি), mov reg, srcওও সিপিইউগুলির জন্য ডিপ চেইনগুলিও ভেঙে ফেলেছে (এসসিআর ইমিও 32 [mem], বা অন্য কোনও নিবন্ধক নির্বিশেষে )। এই নির্ভরতা-ভাঙ্গা অপ্টিমাইজেশন ম্যানুয়ালগুলিতে উল্লেখ করা যায় না কারণ এটি কোনও বিশেষ ক্ষেত্রে নয় যা তখনই ঘটে যখন এসসিআর এবং ডেস্ট একই রেজিস্টার হয়। এটি সর্বদা এমন নির্দেশাবলীর জন্য ঘটে যা তাদের ভাগ্যের উপর নির্ভর করে না। ( popcnt/lzcnt/tzcntগন্তব্যস্থলে মিথ্যা অধিগ্রহণের জন্য ইন্টেলের বাস্তবায়ন ব্যতীত )
পিটার কর্ডেস

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

2
আগ্নেরের মতে কেএনএল 64৪-বিট নিবন্ধকের স্বাধীনতা স্বীকার করে না। সুতরাং xor r64, r64একটি বাইট নষ্ট না। যেমনটি আপনি বলেছেন xor r32, r32সেরা পছন্দ বিশেষত কেএনএল এর সাথে। যদি আপনি আরও পড়তে চান তবে এই মাইক্র্যাচ ম্যানুয়ালটিতে বিভাগের 15.7 বিভাগ "স্বাধীনতার বিশেষ মামলাগুলি" দেখুন।
জেড বোসন

3
আহ, যখন আপনার প্রয়োজন হবে তখন এর "শূন্য রেজিস্ট্রার" সহ ভাল পুরানো এমআইপিএস রয়েছে
হাইয়ালকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.