2012-02-11 6 views
1

고전적인 곱셈 - 누적 연산은 a = a + b * c입니다. (을 A와 B는 64 개 비트 정수 서명되지 않은 : 부호없는 long int와 긴)하지만 현재 1 클럭 사이클의 정수에 다음 작업을 수행 할 수 있습니다 ASM의 지시가 존재 궁금 ​​ C/C++/ASM : 곱하기 a = a * 2 + b를 CPU에 추가 하시겠습니까?

a = a*2-1 
a = a*2+b 

현재, 내가 사용

a *= 2 
a += b 

a *= 2 
--a 
첫 번째에 대한

을 1 초 동안. 그리고 나는 각각이 ASM에서 2 개의 명령어로 변환된다고 생각합니다. 하지만 대신 1 ASM 명령어를 사용하는 방법이 있습니까? (인텔 CPU에서 명령어 세트 확장이 있습니까?)

은 인텔 CPU의 경우

+3

컴파일러에서 생성하는 명령어의 수와 관련하여 중요한 이유는 무엇입니까? 이것은 계산에 소요되는 클록주기의 수와 느슨하게 관련이 있습니다. –

+0

어쩌면'lea'가 그렇게 할 수 있습니다 ... –

+0

@KerrekSB, 맞아요 -'lea'는'b'가 0에서 4096 사이에 있으면'a * 2 + b'를 할 수 있습니다. – ugoren

답변

6
  1. LEA 내용을 참조하십시오 (나는이 작업 수십억 시간을하기 때문에 해당 검색). 하나의 명령어로 두 가지 작업을 수행 할 수 있습니다 (사이클은 확실하지 않음). (예 : LEA EAX, [EAX*2+EBX]). 이것은 실제로 곱셈 - 덧셈 (multiply-add), 즉 재미있는 이름 (load effective address)이라는 의미는 아닙니다.

  2. C 및 C++에서 신경 쓸 필요가 없습니다. 컴파일러는 그것이 최선이라고 생각하는 것을 할 것이고 당신은 아마 그 노력을 방해 할 수 있습니다. 나는 좋은 옛 머물렀다 a = a*2-1.

PS : 당신이 뭔가가 두 개의 명령어로 번역 생각 경우, 어셈블리에보고 더 쉽게 아무것도 없다. 그렇다면 을 알고 있습니다.

+0

동의합니다. 이전에는 CPU가 사용되지 않을 때 유휴 상태 인 전용 주소 계산 단위를 가지고 있었기 때문에 LEA는 무료였습니다. 현세대에서는 그렇지 않을 것입니다. 아마도 현세대에서는 별도의 교대 및 추가로 동일한 마이크로 운영 체제를 생성 할 것입니다. –

관련 문제