- AVX-512의 vpternlogd는 세 입력의 임의 비트 단위 Boolean 논리를 8비트 즉시값으로 골라 한 번에 실행하는 SIMD 명령임
- 핵심은 복잡한 논리식을 외우는 것이 아니라,
#imm8을 세 입력 A/B/C의 8가지 경우에 대한 룩업 테이블로 보는 데 있음
- 1985년 Amiga blitter도 세 비트맵 소스와 8비트 minterm으로 같은 방식의 논리 조합을 지정했으며, masked sprite에는
0xE2가 자주 쓰였음
- 결과 열의 8비트를 아래에서 위로 읽으면 즉시값이 되므로, “세 입력 중 정확히 두 개만 1” 같은 조건도
0x68로 직접 만들 수 있음
- Intel 문서의 vpternlogd 예시와 Amiga demoscene의 흔한
0xE2가 맞닿으며, 현대 SIMD 명령과 레트로 그래픽 하드웨어가 같은 설계 감각을 공유함
AVX-512의 vpternlogd
- vpternlogd는 AVX-512 ISA 설계 발표 자료에서 눈에 띈 비트 단위 삼항 논리 명령임
- 세 입력 A, B, C를 받아 임의의 Boolean 논리를 한 명령어로 표현할 수 있음
- 예:
(NOT A) OR ((NOT B) XOR (C AND A))
- 입력은 512비트 레지스터일 수 있어, 복잡한 논리를 512비트 전체에 동시에 적용 가능함
foo_and_a_or_not_b 같은 전용 명령을 계속 추가하는 대신, 하나의 유연한 명령과 8비트 즉시값으로 여러 논리를 처리함
VPTERNLOGD r0, r1, r3, #imm8
#imm8은 어떤 비트 논리 함수를 수행할지 결정함
- 많은 문서가 즉시값이 “특정 이진 함수를 결정한다”고만 설명해 실제 계산법을 직관적으로 파악하기 어려움
Amiga blitter와 minterm
- 1980년대 컴퓨터는 그래픽 처리를 위해 커스텀 칩을 사용하는 경우가 흔했음
- Commodore Amiga 500의 blitter는 비트맵 그래픽을 한 위치에서 다른 위치로 옮기면서 논리 연산을 적용했음
- 최대 세 비트맵 소스를 다루고, 이들 사이의 논리 연산은 8비트 값인 minterm으로 지정함
- 세 소스와 8비트 값으로 논리 조합을 고른다는 점에서 vpternlogd와 같은 구조를 가짐
- 많은 Amiga 프로그래머는 minterm 계산법을 직접 이해하기보다 자주 쓰이는 값을 재사용했음
- 버퍼를 지울 때는
0x00
- masked sprite를 그릴 때는
0xE2
- 1989년 “Amiga Hardware Reference Manual”은 minterm 계산을 혼란스러운 기호로 설명해 당시 demo 제작자들에게 큰 도움이 되지 않았음
8비트 값을 룩업 테이블로 계산하기
#imm8 또는 minterm은 논리 연산자의 조합이 아니라 8개 항목짜리 룩업 테이블로 볼 수 있음
- 세 입력 A, B, C는 각각 0 또는 1이므로 가능한 조합은 8개임
- 원하는 결과를 네 번째 열에 직접 채우면 됨
| A |
B |
C |
원하는 결과 |
| 0 |
0 |
0 |
? |
| 0 |
0 |
1 |
? |
| 0 |
1 |
0 |
? |
| 0 |
1 |
1 |
? |
| 1 |
0 |
0 |
? |
| 1 |
0 |
1 |
? |
| 1 |
1 |
0 |
? |
| 1 |
1 |
1 |
? |
- 예를 들어 세 입력 중 정확히 두 개만 1일 때 결과를 1로 만들고 싶다면, 네 번째 열에 그 조건에 맞는 값을 채움
- 그 결과 열의 8비트를 아래에서 위로 읽으면
01101000, 즉 0x68이 됨
- 따라서
0x68 함수는 세 입력 중 정확히 두 입력이 1일 때 결과를 1로 설정함
- 같은 방식으로 세 소스 사이의 임의 논리 함수에 필요한
#imm8 값을 얻을 수 있음
masked sprite의 0xE2
- Amiga에서 매우 흔한 minterm 값 중 하나는
0xE2 임
- 이 값은 masked 2D sprite를 렌더링할 때 자주 사용됨
- A: sprite bitmap
- B: sprite mask
- C: background
- 조건은 단순한 프로그램 로직으로 표현할 수 있음
- mask 픽셀 B가 설정되어 있으면 결과는 sprite A
- mask 픽셀 B가 설정되어 있지 않으면 결과는 background C
| A |
B |
C |
원하는 결과 |
| 0 |
0 |
0 |
0 |
| 0 |
0 |
1 |
1 |
| 0 |
1 |
0 |
0 |
| 0 |
1 |
1 |
0 |
| 1 |
0 |
0 |
0 |
| 1 |
0 |
1 |
1 |
| 1 |
1 |
0 |
1 |
| 1 |
1 |
1 |
1 |
- 결과 열을 아래에서 위로 읽으면
11100010, 즉 0xE2 가 됨
0xE2는 Amiga demoscene 문화에서 매우 흔한 minterm 값임
Intel 문서와의 우연한 연결