ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Logical Operations
    Computer Science/Computer Architecture and Organization 2021. 4. 25. 18:39

    Operations

    워드 전체에 대한 처리뿐만 아니라, 일부 비트들 또는 워드내에 8bit로 저장된 문자를 검사하는등의 작업또한 필요했다. 여러개 비트들을 워드로 packing하는 작업과 워드를 비트 단위로 나누는 unpacking작업을 간단하게 하는 연산들이 추가되었는데, 이러한 instructions(명령어)를 logical operations, 논리연산 명령어라고 부른다. 다음은 C언어와 자바의 RISC-V의 logical operations를 보여준다.

    C and Java logical operators and their corresponding RISC-V instructions

    예를 들어서, Java 에서 다음과같이 왼쪽으로 4번 자리이동을 시키는 명령어를 실행시키면?

    int x=9;
    int y = x<<4

    먼저 x19 레지스터에 다음값이 있다고 하자.

    $00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00001001_{two}\; \\
    = 9_{ten} $

    왼쪽으로 자리 이동을 시키면 다음과 같이 된다.

    $00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    10010000_{two}\; \\
    = 144_{ten} $

    위에 보여진 표에서 보여지듯, 이렇게 왼쪽 또는 오른쪽으로 bit의 자리이동을 하는 RISC-V 자리이동 명령어의 이름은 slli(shift left logical immediate)와 srli(shift right logical immediate)이다. 이 자리이동 명령어들은 I-type이다. 위에서 보여진 Java 코드가 RISC-V 명령어로 표현되었을때, 원래 값은 x19에 있고 결과는 x11에 저장된다고 하면 아래와 같이 표현된다.

    slli x11, x19, 4 // reg x11 = xeg x19 << 4 bits

    위 slio instruction은 아래와 같이 인코딩 된다.

    funct6 immediate rs1 funct3 rd opcode
    0 4 19 1 11 19

     

    AND

    코딩 인터뷰에서 가끔 등장하는 연산인 AND또한 구현되어있다. 이 AND는 두 bit값들이 모두 1일 경우에만 1이 된다. 예를 들어 x11레지스터에 다음값이 있고

    $00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00001101\;
    11000000_{two} $

    x10 레지스터에 다음과 같은 값이 있을 때,

    $00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00111100\;
    00000000_{two} $

    아래와 같은 high-level 코드로인해서

    int x = 3520;
    int y = 15360;
    int z = x & y

    아래 RISC-V Instruction이 실행된다면,

    and x9, x10, x11 // reg x9 = reg x10 & reg x11

    x9의 레지스터 값은 다음과 같고,

    $00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00001100\;
    00000000_{two} $

    z값은 3072가 된다. 

     

    이와같이 AND는 어떤 비트 패턴에서 0의 위치에 해당하는 비트들을 강제로 0으로 만드는 데 사용할 수 있는데, 이렇게 사용되는 비트 패턴은, 비트를 감추게 만드는 역할을 하기 때문에 mask라고 부른다. 

     

    OR

    AND과 대칭되는 연산인 OR도 있다. 두 비트중 하나만 1이면 1이 되는것인데, 앞서 사용한 예시에서 아래와 같은 코드였다고 해보자.

    int x = 3520;
    int y = 15360;
    int z = x | y

    그렇다면, 다음과 같은 RISC-V Instruction이 수행될것이다.

    or x9, x10, x11 // reg x9 = reg x10 | reg x11

    연산 이후 x9 레지스터의 값은 다음과 같이 될 것이다.

    $00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00000000\;
    00111101\;
    11000000_{two} $

    결국, z에는 15808의 값이 저장된다.

     

    NOT and XOR

    NOT은 비트가 1이면 0으로, 0이면 1로 만든다. XOR(exclusive OR)은 두 비트가 같을때는 0, 다를때는 1이 된다. 그러므로 NOT은 xor 1111.....1111과 같다고 볼 수 있다. 다음과 같은 코드가 있다고 가정하자.

    int x = 3520;
    int y = 0;
    int z = x ^ y

    그러면 다음과 같은 RISC-V Instruction이 수행된다 (x10에는 x값이, reg11에는 0이 저장되어있다고 가정).

    xor x9, x10, x12 // reg x9 = reg x10 ^ reg x12

    그러면, 다음과 같은 값이 x9레지스터에 저장된다.

    $00000000\;

    00000000\;

    00000000\;

    00000000\;

    00000000\;

    00110001\;

    00111101\;

    11000000_{two} $

    그래서 z의 값은 3520이 된다.

     

     

     

    Reference

    David A. Patterson and John L. Hennessy. 2013. Computer Organization and Design, Fifth Edition: The Hardware/Software Interface (5th. ed.). Morgan Kaufmann Publishers Inc., San Francisco, CA, USA.

    댓글

Designed by Tistory.