Vol.1의 CMPS ~ CVTPD2PS 입니다. 늦어서 죄송합니다.

지현구 2007.03.10 05:09 조회 수 : 64225 추천:114

CMPS - DS:(E/R)SI에 있는 src 문자열과 ES:(E/R)DI에 있는 dest 문자열을 비교한다. 보통 REP 접두어와 같이 사용하여, CX 개만큼의 원소를 비교한다. 이때 DF 플래그가 1이면 역방향으로 진행하며 비교한다. 예제로 Linux 커널의 arch/x86_64/boot/video.S 에 있는 ati_test 를 참고.
        예) CMPSB
        예) CMPSW
        예) CMPSD
        예) CMPSQ

CMPSD/CMPSS - 배정도/단정도 부동소수점 실수 두 개를 비교. CMPSD는 64bit 버전이고 CMPSS는 32bit 버전임.
        dest(첫 번째 operand)와 src(두 번째 operand)의 값을 comparison-predicate(세 번째 operand)가 지정하는 연산을 이용하여 비교한다.
        다음과 같이 작동한다.

        OP[] = {EQ, LT, LE, UNORD, NEQ, NLT, NLE, ORD}
        if (dest[63:0] OP[comparison-predicate] src[63:0])
                dest[63:0] = ffffffffffffffff
        else
                dest[63:0] = 0000000000000000        // dest[127:64] unchanged

        위에서 UNORD는 dest 나 src 중 하나 이상이 NaN일 때 true이고, ORD는 dest 나 src 중 어느 하나도 NaN이 아닐 때 true이다.

        예) CMPSD/CMPSS xmm1, xmm2/m64, imm8
        예) CMPEQSD/CMPLTSD/CMPLESD/CMPUNORDSD/CMPNEQSD/CMPNLTSD/
                CMPNLESD/CMPORDSD xmm1, xmm2

CMPXCHG/CMPXCHG8B/CMPXCHG16B - 비교 직후 값을 바꾼다. 구체적으로 다음과 같은 일을 한다.
        if (accumulator == dest) {
                zf = 1; dest = src;
        } else {
                zf = 0; accumulator = dest;
        }

        여기서 cmpxchg dest, src 를 사용하는 경우 accumulator는 AL/AX/EAX/RAX 이다.
        cmpxchg8b dest 를 사용하는 경우 accumulator는 EDX:EAX이고 src는 ECX:EBX이다.
        cmpxchg16b dest 를 사용하는 경우 accumulator는 RDX:RAX이고 src는 RCX:RBX이다.

        LOCK prefix와 함께 사용하면 원자적으로 실행(atomic execution)된다.
        Linux 커널 소스의 include/asm-x86_64/system.h 에서 cmpxchg()와 __cmpxchg() 를 참고하라.

        예) cmpxchg r/m, r
        예) cmpxchg8b m64
        예) cmpxchg16b m128

COMISD/COMISS - 배정도/단정도 부동소수점 실수 값을 비교하여 EFLAGS 를 세팅해 준다. COMISD는 64비트 버전이고, COMISS는 32비트 버전이다.
        첫 번째 operand와 두 번째 operand를 비교한 결과에 따라 ZF,PF,CF 에 들어오는 값이 다음과 같이 된다.
        1) UNORDERED이면(즉, 둘 중 하나 이상이 NaN이면) 1,1,1
        2) GREATER_THAN이면 0,0,0
        3) LESS_THAN이면 0,0,1
        4) EQUAL이면 1,0,0
        단, 둘 중 하나가 SNaN 또는 QNaN이면 Invalid Numeric Exception이 발생한다.

CPUID - CPU에 대한 정보를 돌려준다. EAX 에 어떤 값이 들어있느냐에 따라 EAX, EBX, ECX, EDX에 각종 정보를 돌려준다.
        CPUID 가 돌려주는 정보들은 다음과 같다.
        - CPU 버전, 모델, 시리얼번호
        - Cache와 TLB
        - MONITOR/MWAIT
        - Thermal & Power 매니지먼트
        - 퍼포먼스
        - Signature 및 Brand string
        - Virtual/physical adress size

        또한 instruction 수행을 serialize(직렬화)하는 데 CPUID 가 쓰인다. 즉, CPUID 인스트럭션 전에 나오는 인스트럭션에 의한 플래그/레지스터/메모리 수정이 다 끝난 다음에야 CPUID 다음에 나오는 인스트럭션이 수행된다.

        사용 예를 보려면 Linux 커널의 arch/x86_64 또는 include/asm-x86_64 에서 "grep -R cpuid ." 를 사용해 보라.

        예) CPUID

        예) comisd/comiss xmm1, xmm2/m64

CVTDQ2PD - 부호 있는 doubleword 정수 배열을 배정도 부동소수점 실수 배열로 바꾼다.

CVTDQ2PS - 부호 있는 doubleword 정수 배열을 단정도 부동소수점 실수 배열로 바꾼다.

CVTPD2DQ - 배정도 부동소수점 실수 배열을 부호 있는 doubleword 정수 배열로 바꾼다.

CVTPD2PI - 배정도 부동소수점 실수 배열을 MMX 레지스터에 부호 있는 doubleword 정수로 바꾸어 넣는다.

CVTPD2PS - 배정도 부동소수점 실수 배열을 단정도 부동소수점 실수 배열로 바꾼다.
번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2201
45 first.S에서 초기에 Ox9A000로 이동하는 이유 송형주 2007.03.13 2595
44 저번주 스터디 내용 좀 정리해 주세요. [3] 정필섭 2007.03.12 4521
43 제가 참고한 자료들입니다. [3] file 김종화 2007.03.12 4808
42 PPC 제본한거 남은거 있나요? [1] 원민수 2007.03.12 4605
41 지난시간에 약간 모호했던 부분중... 선준규 2007.03.11 2643
40 lilo 21.4.4 source 파일입니다. file 송형주 2007.03.11 2567
39 3월 10일 LKSAS 세번째 모임 수고 하셨습니다. 강형석 2007.03.11 2856
38 메일링 리스트 만들었습니다. 유상민 2007.03.11 2654
37 lilo 분석 링크 유상민 2007.03.11 3329
36 AAA ~ AND 까지 입니다. 박경태 2007.03.10 8492
35 아~ RGB 케이블 찾았습니다. 강형석 2007.03.10 2506
34 늦었지만 지난주 Instruction ANDPD ~ BTS 강석천 2007.03.10 4053
33 volume 1. LIDT ~ LODS 입니다. 늦어서 죄송합니다;; 선준규 2007.03.10 2786
» Vol.1의 CMPS ~ CVTPD2PS 입니다. 늦어서 죄송합니다. file 지현구 2007.03.10 64225
31 제가 ppc 책 없었는데 책 파신분요. 유태경 2007.03.10 4710
30 분담 5(PREFETCHh ~ RCL/RCR/ROL/ROR) 입니다. 늦어서 죄송합니다 file 지현구 2007.03.10 6260
29 저한테 저번주에 할당되어 있던 Instruction올립니다. 남용우 2007.03.09 3767
28 vol2의 분담3과 vol1 명령어입니다. 이종우 2007.03.09 3810
27 명령어 정리 - 늦어서 죄송.. 송형주 2007.03.09 14528
26 Instruction 정리. 남현우 2007.03.09 4745
XE Login