2010-04-21 6 views
1

네이티브 MIPS에서 다중 정밀도 산술을 구현하려고합니다. 하나의 64 비트 정수가 $ 12 및 $ 13 레지스터에 있고 다른 레지스터가 $ 14 및 $ 15에 있다고 가정합니다. 합계는 $ 10 및 $ 11 레지스터에 저장됩니다. 64 비트 정수의 최상위 워드는 짝수 번호 레지스터에 있고 최하위 워드는 홀수 번호 레지스터에 있습니다. 인터넷에서 이것은 가능한 가장 짧은 구현이라고 말했다.MIPS에서 다중 정밀도 산술

addu $11, $13, $15 # add least significant word 
sltu $10, $11, $15 # set carry-in bit 
addu $10, $10, $12 # add in first most significant word 
addu $10, $10, $14 # add in second most significant word 

나는 올바르게 이해하고 있는지 확인하고 싶습니다. sltu는 두 최하위 단어의 합이 피연산자 중 하나보다 작거나 같은지 확인합니다. 이 경우 캐리 발생보다이 경우입니까?

은 두 개의 가장 중요한 단어를 추가 할 때 캐리가 발생하는 경우 확인하고 내가해야 할 $ 9 결과 저장하려면

sltu $9, $10, $12 # set carry-in bit 

이 어떤 의미가 있습니까를?

답변

0

sltu는 두 개의 최하위 단어의 합이 피연산자 중 하나보다 작거나 같은지 확인합니다.

없음 매우 : 이는 두 개의 최하위 워드의 합 경우 1로 설정 $10 엄격 (32 비트 부호없는 값으로 간주) 피연산자 미만; 합이 해당 피연산자와 같거나 클 경우 0입니다.

이 경우 캐리 발생보다 옳은 것입니까?

예. 오버 플로우가 발생하지 않은 경우

  • , 우리가해야합니다

    는 (모든 부호없는 32 비트 값이다) A는 어떤 특정 값에 B의 여러 가능한 값을 추가 할 때 발생할 수있는 고려 < = 합 < = 0xFFFFFFFF로하므로 < = 0 < B = (- 0xFFFFFFFF로)를 갖는다.

  • b의 나머지 경우는 오버플로가 발생합니다. 이러한 경우, 실제 합 0x100000000로 < = 합 < = 있어야 32 비트로 절두 + 0xFFFFFFFF로는 0을 < = 합 = < 범 - 1.

내가해야 할 $ (9) 에 결과를 캐리가 발생하면 가장 중요한 두 단어를 추가 할 때 확인하고 저장하려면

sltu $9, $10, $12 # set carry-in bit

하지 꽤 있습니다.

여기서 문제는 두 개의 32 비트 값인 을 더한 것입니다. 가장 중요한 단어의 합계에서 나온 것일 수 있습니다. 예를 들어, 캐리가 있고 가장 중요한 두 단어가 모두 0xFFFFFFFF 인 경우를 생각해보십시오. 합계는 1 + 0xFFFFFFFF + 0xFFFFFFFF = 0xFFFFFFFF이므로 캐리가 설정되지는 않습니다 (그러나 반드시 같아야합니다).

이 문제를 처리하는 한 가지 방법은 $12$10에 추가 한 후에 캐리를 확인하고 그 합계에 $11을 추가 한 후 다시 확인하는 것입니다. 0이 아니면 $10이 0이거나 1이므로이 합계 중 하나만 캐리를 생성 할 수 있습니다 ($12 + $10$12이 0xFFFFFFFF 일 때 오버플로만 발생하며이 경우 합계는 0이므로 두 번째 합계도 오버플로 할 수 없음).

그래서이 수도 (면책 조항 :이 말, 그리고이 안된) 트릭을 수행합니다

addu $11, $13, $15 
sltu $10, $11, $15 # carry from low word 
addu $10, $10, $12 
sltu $9, $10, $12 # possible carry from high word (1) 
addu $10, $10, $14 
sltu $8, $10, $14 # possible carry from high word (2) 
or $9, $8, $9 # carry in result if either (1) or (2) were true (can't both be true at once)