분담 5(PREFETCHh ~ RCL/RCR/ROL/ROR) 입니다. 늦어서 죄송합니다

지현구 2007.03.10 01:41 조회 수 : 6260 추천:137

PREFETCHh - 메모리의 데이터를 캐쉬에 가져다 놓는다
        예) PREFETCHT0 m8
        예) PREFETCHT1 m8
        예) PREFETCHT2 m8
        예) PREFETCHNTA m8
        참고) [정덕영] p.375. 특별한 명령어를 이용한 최적화

PSADBW - dest(첫 번째 operand) 및 src(두 번째 operand) 각각에, 1바이트짜리 부호없는 정수가 8개(또는 16개) 늘어선 벡터가 있다고 본다. 이때 이 인스트럭션은, 두 벡터의 element-by-element 차이의 절대값들의 합을 구해서 dest에 넣어준다.
        즉, sum_{i=0 to 7} (abs(dest[i] - src[i])) 를 dest에 넣어 준다.
        예) PSADBW mm1, mm2/m64
        예) PSADBW xmm1, xmm2/m128

PSHUFB - src(두 번째 operand)의 내용에 따라 dest(첫 번째 operand)에 있는 바이트 배열을 shuffle한다.
        즉, dest[i] = dest[src[i]]
        예) PSHUFB mm1, mm2/m64
        예) PSHUFB xmm1, xmm2/m128

PSHUFD - src(두 번째 operand)에 들어 있는 doubleword 배열을 order(세 번째 operand)에 따라 셔플하여 dest(첫 번째 operand)에 넣는다.
        dest[i] = src[order[i]], 여기서 order[i]는 2bits
        예) PSHUFD xmm1, xmm2.m128m imm8

PSHUFHW - PSHUFD 와 비슷. 단, 하위 word 4개는 src에서 dest로 그대로 복사

PSHUFLW - PSHUFD 와 비슷. 단, 상위 word 4개는 src에서 dest로 그대로 복사

PSHUFW - src(두 번째 operand)에 들어 있는 word 배열을 order(세 번째 operand)에 따라 셔플하여 dest(첫 번째 operand)에 넣는다.
        예) PSHUFW mm1, mm2/m64, imm8

PSIGNB/PSIGNW/PSIGND - src[i]가 음수이면 dest[i]의 부호를 뒤집는다.
        예) PSIGNB/PSIGNW/PSIGND mm1, mm2/m64
        예) PSIGNB/PSIGNW/PSIGND xmm1, xmm2/m128

PSLLDQ - dest(첫 번째 operand)에 들어있는 double quadword 값을 count(두 번째 operand) 바이트만큼 왼쪽으로 logical shift한다. 하위의 빈 자리는 0으로 채워진다.
        예) PSLLDQ xmm1, imm8

PSLLW/PSLLD/PSLLQ - dest[i]를 count[i] 비트만큼 왼쪽으로 logical shift한다. dest[i]의 하위의 빈 자리는 0으로 채워진다.
        예) PSLLW/PSLLD/PSLLQ mm, mm/m64
        예) PSLLW/PSLLD/PSLLQ xmm1, xmm2/m128
        예) PSLLW/PSLLD/PSLLQ mm, imm8
        예) PSLLW/PSLLD/PSLLQ xmm1, imm8

PSRAW/PSRAD - dest[i]를 count[i] 비트만큼 왼쪽으로 arithmetic shift한다. dest[i]의 상위의 빈 자리는, 쉬프트 전의 dest[i]의 부호 비트(최상위 비트)로 채워진다.
        예) PSRAW/PSRAD mm, mm/m64
        예) PSRAW/PSRAD xmm1, xmm2/m128
        예) PSRAW/PSRAD mm, imm8
        예) PSRAW/PSRAD xmm1, imm8

PSRLDQ - dest(첫 번째 operand)에 들어있는 double quadword 값을 count(두 번째 operand) 바이트만큼 오른쪽으로 logical shift한다. 상위의 빈 자리는 0으로 채워진다.

PSRLW/PSRLD/PSRLQ - dest[i]를 count[i] 비트만큼 오른쪽으로 logical shift한다. dest[i]의 상위의 빈 자리는 0으로 채워진다.
        예) PSRLW/PSRLD/PSRLQ mm, mm/m64
        예) PSRLW/PSRLD/PSRLQ xmm1, xmm2/m128
        예) PSRLW/PSRLD/PSRLQ mm, imm8
        예) PSRLW/PSRLD/PSRLQ xmm1, imm8

PSUBB/PSUBW/PSUBD - 두 정수 배열의 element-by-element 차를 구하는 SIMD 오퍼레이션.
        즉, dest[i] = dest[i] - src[i]
        예) PSUBB/PSUBW/PSUBD mm, mm/m64
        예) PSUBB/PSUBW/PSUBD xmm1, xmm2/m128

PSUBQ - quadward 정수 배열의 element-by-element 차를 구한다.
        즉, dest[i] = dest[i] - src[i]
        예) PSUBQ mm1, mm2/m64
        예) PSUBQ xmm1, xmm2/m128

PSUBSB/PSUBSW - 두 정수 배열의 element-by-element 차를 구하는 SIMD 오퍼레이션. 단 뺄셈의 결과가 부호 있는 byte/word 정수의 범위를 넘으면, 범위의 한계치로 saturate시킨다.
        즉,
        temp = dest[i] - src[i]
        if (temp > MAXINT) dest[i] = MAXINT
        else if (temp < MININT) dest[i] = MININT
        else dest[i] = temp
        예) PSUBSB/PSUBSW mm, mm/m64
        예) PSUBSB/PSUBSW xmm1, xmm2/m128

PSUBUSB/PSUBUSW - 두 부호없는 정수 배열의 element-by-element 차를 구하는 SIMD 오퍼레이션. 단 뺄셈의 결과가 음수가 되면 0으로 saturate시킨다.
        즉,
        temp = dest[i] - src[i]
        if (temp < 0) dest[i] = 0
        else dest[i] = temp
        예) PSUBUSB/PSUBUSW mm, mm/m64
        예) PSUBUSB/PSUBUSW xmm1, xmm2/m128

PUNPCKHWB/PUNPCKHWD/PUNPCKHDQ/PUNPCKHQDQ - 두 배열의 상위 원소들을 교대로 끼워넣기. 즉,
        before: src = {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0}
               dest = {X7, X6, X5, X4, X3, X2, X1, X0}
        after: dest = {Y7, X7, Y6, X6, Y5, X5, Y4, X4}
        예) PUNPCKHWB/PUNPCKHWD/PUNPCKHDQ mm, mm/m64
        예) PUNPCKHWB/PUNPCKHWD/PUNPCKHDQ/PUNPCKHQDQ xmm1, xmm2/m128

PUNPCKLWB/PUNPCKLWD/PUNPCKLDQ/PUNPCKLQDQ - 두 배열의 하위 원소들을 교대로 끼워넣기. 즉,
        before: src = {Y7, Y6, Y5, Y4, Y3, Y2, Y1, Y0}
               dest = {X7, X6, X5, X4, X3, X2, X1, X0}
        after: dest = {Y3, X3, Y2, X2, Y1, X1, Y0, X0}
        예) PUNPCKLWB/PUNPCKLWD/PUNPCKLDQ mm, mm/m64
        예) PUNPCKLWB/PUNPCKLWD/PUNPCKLDQ/PUNPCKLQDQ xmm1, xmm2/m128

PUSH - word, doubleword, quadword를 스택에 push한다. 즉, RSP/ESP/SP값을 operand 사이즈만큼 감소시키고, 그 값이 가리키는 메모리 주소에 operand 값을 넣는다.
        예) PUSH r/m16
        예) PUSH r/m32
        예) PUSH r/m64
        예) PUSH r16
        예) PUSH r32
        예) PUSH r64
        예) PUSH imm8
        예) PUSH imm16
        예) PUSH imm32
        예) PUSH CS
        예) PUSH SS
        예) PUSH DS
        예) PUSH ES
        예) PUSH FS
        예) PUSH GS

PUSHA/PUSHAD - 모든 general-purpose 레지스터들을 스택에 push한다.
        operand-size가 16이면 mnemonic이 PUSHA가 되는데, 이때는 AX, CX, DX, BX, 원래의 SP, BP, SI, DI 값을 push한다.
        반면 operand-size가 32이면 mnemonic이 PUSHAD가 되는데, 이떄는 EAX, ECX, EDX, EBX, 원래의 ESP, EBP, ESI, EDI 값을 push한다.
        64bit 모드에서는 #UD 익셉션을 발생시킨다.
        예) PUSHA
        예) PUSHAD

PUSHF/PUSHFD - EFLAGS 레지스터를 스택에 push한다.
        operand-size가 16이면 mnemonic이 PUSHF가 되는데, 이때는 EFLAGS의 하위 16비트를 push한다.
        반면 operand-size가 32이면 mnemonic이 PUSHFD가 되는데 (64bit 모드가 아닐 때만 해당됨), 이때는 EFLAGS를 push한다.
        반면 operand-size가 64이면 mnemonic이 PUSHFQ가 되는데 (64bit 모드일때만 해당됨), 이때는 RFLAGS를 push한다.
        가상 8086모드이고 IOPL(I/O 특권 레벨)이 3보다 작으면 #GP 익셉션을 발생시킨다.
        예) PUSHF
        예) PUSHD
        예) PUSHQ

PXOR - 비트 단위의 logical 배타적OR(XOR) 연산. dest(첫 번째 operand)와 src(두 번째 operand) 값을 비트 단위로 XOR한 결과가 dest에 들어간다.
        예) PXOR mm, mm/m64
        예) PXOR xmm1, xmm2/m128

RCL/RCR/ROL/ROR - dest(첫 번째 operand) 값을 count(두 번째 operand) 비트만큼 왼쪽(RCL, ROL)/오른쪽(RCR, ROR)으로 로테이트(rotate)한다. 이때 RCL이나 RCR은, CF 플래그가 dest의 최상위비트보다 하나 윗자리에 붙어있다고 생각하고, CF 플래그와 dest를 한 덩어리로 보고 로테이트를 시킨다.
        예) RCL/RCR/ROL/ROR r/m8, 1/CL/imm8
        예) RCL/RCR/ROL/ROR r/m16, 1/CL/imm8
        예) RCL/RCR/ROL/ROR r/m32, 1/CL/imm8
        예) RCL/RCR/ROL/ROR r/m64, 1/CL/imm8
번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2198
185 volume 1. LIDT ~ LODS 입니다. 늦어서 죄송합니다;; 선준규 2007.03.10 2786
184 Vol.1의 CMPS ~ CVTPD2PS 입니다. 늦어서 죄송합니다. file 지현구 2007.03.10 64216
» 분담 5(PREFETCHh ~ RCL/RCR/ROL/ROR) 입니다. 늦어서 죄송합니다 file 지현구 2007.03.10 6260
182 저한테 저번주에 할당되어 있던 Instruction올립니다. 남용우 2007.03.09 3767
181 vol2의 분담3과 vol1 명령어입니다. 이종우 2007.03.09 3810
180 명령어 정리 - 늦어서 죄송.. 송형주 2007.03.09 14527
179 Instruction 정리. 남현우 2007.03.09 4745
178 EM64T Instruction 정리자료 Final 버전입니다. [1] file 김정수 2007.03.08 3804
177 분담 6 맥주 2007.03.08 3957
176 저번주에 할당되어 있던 Instruction도 올려주세요!!! 김정수 2007.03.07 4544
175 분담 4를 해석한 자료 올립니다. file 강형석 2007.03.07 3130
174 lilo 공부하실때 참고 할만한 자료 입니다. [5] 강형석 2007.03.07 3034
173 asm 강좌 문서 file 맥주 2007.03.06 4147
172 분담2 MOVLHPS ~ MOVUPD 까지입니다 선준규 2007.03.06 4851
171 메신저 주소 공유합시다!! [8] 김정수 2007.03.04 3672
170 "만들면서 배우는 OS 커널의 구조와 원리/김범준 저"에 오늘 공부했던 내용에 대해 쉽게 적혀있네요. [4] 김정수 2007.03.04 5380
169 EM64T_Guide [2] file 이종우 2007.03.04 3502
168 x86 아키텍쳐에 관한 동영상 강좌 링크입니다. [6] 남현우 2007.03.04 4413
167 3월 3일 LKSAS 두번째 모임 즐거웠습니다. [7] file 김정수 2007.03.04 5046
166 제송.... 제가 이번에 스터디 그룹에 참여하는데 아직 공부할 부분을 할당받지 못했는데요... [2] 강형석 2007.03.02 5261
XE Login