MMX ¶
- MMX는 MultiMedia eXtention의 약자로 그 목적은 범용레지스터의 크기보다 큰 정수연산을 보다 빠르게 하기 위함입니다.
- 이 문서를 작성하는 현재시점을 기준으로 MM0 ~ 7까지의 특수 명칭이 MMX에 사용되고 있으며 이름만 이렇게 사용될뿐 사실상 부동소수점 연산용 레지스터를 사용하게 됩니다. (이러한 이유로 아래 설명하지만 EMMS의 명령에 대해서 필요한 이유를 이해하세요!)
- MMX의 가장 대표적인 기능으로는 8바이트 단위로 Data를 전송하는 것인데 이것 말고도 기본 산술연산 및 논리연산을 할수 있게 되어 있습니다.
- MMX는 범용레지스터로 하는 기능과 비교했을 때 다른 점이 Packed mode라는 것이 있는데 아직 이것에 대한 필요성을 제가 못느끼고 있는 관계로 나중에 필요성이 생기면 정리좀 해보겠습니다.
1.2. MMX의 지원여부 판단 ¶
- 아래와 같이 cpuid명령을 통하여 해당 기능의 지원 여부를 확인 할수 있습니다. 이밖에 3D-NOW같은 경우도 비슷한 방법으로 지원여부를 알수 있겠습니다.
int MZ_IsMMX(void)
{
static int s_Return = (-1);
if(s_Return == (-1))
{
__asm__ __volatile__(
"\n\t"
"movl $1, %%eax\n\t"
"cpuid\n\t"
"xorl %%eax, %%eax\n\t"
"testl $0x800000, %%edx\n\t"
"jz L_Return\n\t"
"incl %%eax\n\t"
"L_Return:\n\t"
"movl %%eax, %0\n\t"
"\n\t"
: "=m"(s_Return)
:
: "ebx"
);
}
return(s_Return);
}
1.3. MMX 명령어 요약표 ¶
- 특별한 설명이 없더라도 아래의 요약표를 보시면 어셈블리 개발자분들이라면 그리 어렵지 않게 접근하실수 있을겁니다.
- EMMS에 대해 간단히 추가설명하자면 부동소수점 연산을 하기 위해서 상태를 지울 필요가 있는데 그런 경우에 적절히 삽입하여 사용하여야 합니다. (즉, MMX명령을 사용하게 되면 EMMS명령은 뒤따라야 골치아픈 오동작 계산을 방지할수 있습니다.)
| 기능 | 값의 순환이 고려될 때 | 부호가 고려될 때 | 부호가 고려되지 않을 때 |
| 산술덧셈 | PADDB, PADDW, PADDD | PADDSB, PADDSW | PADDUB, PADDUW |
| 산술뺄셈 | PSUBB, PSUBW, PSUBD | PSUBSB, PSUBSW | PSUBUB, PSUBUW |
| 산술곱셈 | PMULL, PMULH | | |
| 산술곱셈자리올림 | PMADD | | |
| 비교 | PCMPEQB, PCMPEQW, PCMPEQD | | |
| PCMPGTPB, PCMPGTPW, PCMPGTPD | | |
| 변환 | PUNPCKHBW | PACKSSWB | PACKUSWB |
| PUNPCKHWD | PACKSSDW | |
| PUNPCKHDQ | | |
| PUNPCKLBW | | |
| PUNPCKLWD | | |
| PUNPCKLDQ | | |
| 논리연산 | 묶음의 단위 | Quad단위 |
| | PAND |
| | PANDN |
| | POR |
| | PXOR |
| | PSLLQ |
| | PSRLQ |
| 전송 | Double word 전송 | Quad word 전송 |
| MOVD | MOVQ |
| MMX 상태를 비움 | EMMS |
- 이 문서를 작성하기 위해 Intel pentium manual을 참조하였습니다. 자세한것은 Intel의 홈페이지를 방문하세요.
- 이 문서의 최근 문서는 http://minzkn.pe.ky 에서 보실수 있습니다.
|
|