ฉันใช้ MSVC 2010 SP1 และฉันมีรหัส C++ บรรทัดต่อไปนี้:
int32_t c = (int64_t(a)*int64_t(b))>>2;
เมื่อ a
และ b
ไม่ใช่ค่าคงที่ MSVC จะสร้างคำสั่ง 32 บิต imul
และ shrd
อย่างถูกต้อง แต่เมื่อ a
หรือ b
เป็นค่าคงที่ มันจะทำให้เกิดการเรียกไปที่ _allmull
แทนที่จะเป็นคำสั่ง imul
มีเหตุผลอะไรบ้างสำหรับเรื่องนี้? ฉันจะบังคับ/ชี้แนะให้สร้างโค้ดที่ดีอยู่เสมอได้อย่างไร สิ่งที่กวนใจฉันคือเหตุใดจึงสร้างโค้ดที่แย่ลงเมื่อมีข้อมูลเวลาในการคอมไพล์มากกว่า ฉันพบว่าฟังก์ชัน _allmull
ทำการคูณ 64 บิต แต่ฉันคิดว่ามันไม่จำเป็นในกรณีนี้
ฉันสังเกตเห็นด้วยว่าสำหรับบรรทัด int32_t c = (int64_t(a)*int64_t(b))/4;
มันยังสร้าง _alldiv สำหรับการหารด้วย 4 ด้วยซ้ำ
แก้ไข: ดูเหมือนว่าจะเป็นข้อผิดพลาดของคอมไพเลอร์ ฉันได้กรอกข้อผิดพลาด รายงาน.
uint32_t
และuint64_t
? - person Alexandre C.   schedule 06.04.2011