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
예) 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
댓글 0
.