분담 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 2200
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
32 Vol.1의 CMPS ~ CVTPD2PS 입니다. 늦어서 죄송합니다. file 지현구 2007.03.10 64225
31 제가 ppc 책 없었는데 책 파신분요. 유태경 2007.03.10 4710
» 분담 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