문서의 임의 삭제는 제재 대상으로, 문서를 삭제하려면 삭제 토론을 진행해야 합니다. 문서 보기문서 삭제토론 컴파일러 (문단 편집) == intrinsic == C 등의 고급 언어에서 CPU의 인스트럭션 하나로 해결할 수 있는 복잡한 기능(?)을 사용할 경우 특정 함수를 호출하면 컴파일러가 함수를 호출하는 명령을 넣어주는 것이 아니라 그냥 그 자리에 어셈블리를 사용한 것과 동일하게 기계어 코드를 직접 넣어주는 함수(처럼 생긴 예약어)가 있는데 이것을 intrinsic, 혹은 built-in function이라고 한다([[인라인 함수]]와는 다르다). Compare-And-Exchange[* Compare-And-Swap이라고도 하며 줄여서 CAE 또는 CAS라고 부른다. 이는 멀티 쓰레딩이나 멀티 프로세싱에서 같은 메모리를 동시에 수정할 때 동기화 문제를 해결하기 위해 현대의 대부분의 CPU에서 지원하는 원자적인(atomic) 명령어이다.]의 예를 들어 a값이 m인 경우 n으로 바꾸는 코드는 x86 CPU에서 cmpxchg 인스트럭션 하나로 해결이 가능하다. 이러한 명령은 컴파일러가 지원하는 인트린식을 사용하면 된다. [[RISC]]에서 pseudoinstruction[* 어셈블리 명령어는 있지만 실제 바이너리를 까보면 어러 명령어의 집합으로 나오는 경우]을 사용하는 것과 반대의 개념으로 볼 수 있다. 컴파일러별로, 그리고 아키텍처별로 지원하는 인트린식이 다르니 사용을 원하면 컴파일러 매뉴얼을 참조하면 된다. {{{#!syntax cpp int a, b; ... b = CAS(&a, 10, 20); .... }}} * C 코드 {{{#!syntax cpp int CAS(int* pos, int oldval, int newval) { int oldpos = *pos; if(*pos == oldval) * pos = newval; return oldpos; } }}} * 어셈블리 코드(x86-64) {{{CAS: movl %edx, %eax lock cmpxchgl %esi, (%rdi) ret }}} * 어셈블리 코드(x86 32비트) (built-in function을 사용하지 않은 경우) {{{CAS: mov ecx, dword ptr[esp + 4] mov eax, dword ptr[ecx] push eax; mov ebx, dword ptr[esp + 12]; cmp ebx, eax; jne endpoint; mov dword ptr[ecx], dword ptr[esp + 16]; endpoint: pop eax; ret 16; }}} * 어셈블리 코드(x86) (built-in function을 사용한 경우) {{{CAS: mov ecx, dword ptr[esp + 4] mov eax, dword ptr[ecx] mov ebx, dword ptr[esp + 8]; mov edx, dword ptr[esp + 12]; cmpxchg ebx, edx; mov dword ptr[ecx], esp; ret 16; }}} * VC++ intrinsic {{{#!syntax cpp b = _InterlockedCompareExchange(&a, 20, 10); }}} * gcc built-in function {{{#!syntax cpp b = __sync_val_compare_and_swap(&a, 10, 20); }}}또 다른 예제로 popcount를 들 수 있다. 정수형의 값에서 1로 세트된 비트를 세는 것이다. {{{#!syntax cpp printf("%d %d\n", popcount(0x0000FFFF), popcount(0x00000001)); 16 1 }}} * C 코드 {{{#!syntax cpp int popcount(unsigned int a) { int i, cnt = 0; for(i = 0; i < sizeof(unsigned int) * 8; i++) { /* i번째 비트가 1이면 cnt 증가 */ if(((a >> i) & 1) == 1) cnt++; /* cnt += (a>>i) & 1; ^^; */ } return cnt; } }}} * gcc built-in function {{{#!syntax cpp int popcount(unsigned int a) { return __builtin_popcount(a); } }}} ~~참 쉽죠?~~ [[인텔]]의 x86 CPU는 [[삼각함수]]나 [[로그]] 등의 실수연산을 CPU가 바로 지원해주기 때문에 x86용 컴파일러는 대부분의 수학 함수를 인트린식으로 지원한다.저장 버튼을 클릭하면 당신이 기여한 내용을 CC-BY-NC-SA 2.0 KR으로 배포하고,기여한 문서에 대한 하이퍼링크나 URL을 이용하여 저작자 표시를 하는 것으로 충분하다는 데 동의하는 것입니다.이 동의는 철회할 수 없습니다.캡챠저장미리보기