No older revisions available
No older revisions available
- MMX는 MultiMedia eXtention의 약자로 그 목적은 범용레지스터의 크기보다 큰 정수연산을 보다 빠르게 하기 위함입니다.
- 이 문서를 작성하는 현재시점을 기준으로 MM0 ~ 7까지의 특수 명칭이 MMX에 사용되고 있으며 이름만 이렇게 사용될뿐 사실상 부동소수점 연산용 레지스터를 사용하게 됩니다. (이러한 이유로 아래 설명하지만 EMMS의 명령에 대해서 필요한 이유를 이해하세요!)
- MMX의 가장 대표적인 기능으로는 8바이트 단위로 Data를 전송하는 것인데 이것 말고도 기본 산술연산 및 논리연산을 할수 있게 되어 있습니다.
- MMX는 범용레지스터로 하는 기능과 비교했을 때 다른 점이 Packed mode라는 것이 있는데 아직 이것에 대한 필요성을 제가 못느끼고 있는 관계로 나중에 필요성이 생기면 정리좀 해보겠습니다.
1.2. MMX의 지원여부 판단
- 아래와 같이 cpuid명령을 통하여 해당 기능의 지원 여부를 확인 할수 있습니다. 이밖에 3D-NOW같은 경우도 비슷한 방법으로 지원여부를 알수 있겠습니다.
int mz_is_support_mmx(void)
{
static int sg_result = (-1);
if(sg_result == (-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"(sg_result)
:
: "ebx"
);
}
return(sg_result);
}
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의 홈페이지를 방문하세요.