shift_r.s 502 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. .text
  2. .align 4
  3. .code 32
  4. .global shift_r
  5. .type shift_r, %function
  6. shift_r:
  7. MOV r2,r0
  8. CMP r0,#0
  9. BEQ END
  10. CMP r1,#0
  11. BEQ END
  12. BGT L_SHIFT
  13. R_SHIFT:
  14. SUB r1,#1
  15. EOR r1,r1,r1, ASR # 31
  16. CMP r1,#15
  17. MOVGT r0,#0
  18. BGT END
  19. ASRS r0,r0,r1
  20. ADDCS r0,r0,#1
  21. B END
  22. L_SHIFT:
  23. CMP r1,#15
  24. BGT OVERFLOW
  25. ADD r1,r1,#16
  26. LSL r0,r0,r1
  27. CMP r2,r0,ASR r1
  28. BNE OVERFLOW
  29. ASR r0,r0,#16
  30. B END
  31. OVERFLOW:
  32. CMP r2,#0
  33. MOVWGT r0,#0x7FFF
  34. MOVLT r0,#0x80000000
  35. ASRLT r0,r0,#16
  36. B END
  37. END:
  38. BX lr