fork download
  1. uint8_t my_log2 (uint32_t op)
  2. {
  3. uint8_t res;
  4. asm(
  5. " cpse %D[op],__zero_reg__\n"
  6. " rjmp foundD%=\n"
  7. " cpse %C[op],__zero_reg__\n"
  8. " rjmp foundC%=\n"
  9. " cpse %B[op],__zero_reg__\n"
  10. " rjmp foundB%=\n"
  11. " cpse %A[op],__zero_reg__\n"
  12. " rjmp foundA%=\n"
  13. " clr r16\n"
  14. " rjmp end%=\n"
  15. "foundD%=:\n"
  16. " ldi r16,0x18\n"
  17. " mov r17,%D[op]\n"
  18. " rjmp examine%=\n"
  19. "foundC%=:\n"
  20. " ldi r16,0x10\n"
  21. " mov r17,%C[op]\n"
  22. " rjmp examine%=\n"
  23. "foundB%=:\n"
  24. " ldi r16,0x08\n"
  25. " mov r17,%B[op]\n"
  26. " rjmp examine%=\n"
  27. "foundA%=:\n"
  28. " ldi r16,0x00\n"
  29. " mov r17,%A[op]\n"
  30. "examine%=:\n"
  31. " bst r17,7\n"
  32. " brts bit7%=\n"
  33. " bst r17,6\n"
  34. " brts bit6%=\n"
  35. " bst r17,5\n"
  36. " brts bit5%=\n"
  37. " bst r17,4\n"
  38. " brts bit4%=\n"
  39. " bst r17,3\n"
  40. " brts bit3%=\n"
  41. " bst r17,2\n"
  42. " brts bit2%=\n"
  43. " bst r17,1\n"
  44. " brts bit1%=\n"
  45. " subi r16,0xFF\n"
  46. " rjmp end%=\n"
  47. "bit7%=:\n"
  48. " subi r16,0xF8\n"
  49. " rjmp end%=\n"
  50. "bit6%=:\n"
  51. " subi r16,0xF9\n"
  52. " rjmp end%=\n"
  53. "bit5%=:\n"
  54. " subi r16,0xFA\n"
  55. " rjmp end%=\n"
  56. "bit4%=:\n"
  57. " subi r16,0xFB\n"
  58. " rjmp end%=\n"
  59. "bit3%=:\n"
  60. " subi r16,0xFC\n"
  61. " rjmp end%=\n"
  62. "bit2%=:\n"
  63. " subi r16,0xFD\n"
  64. " rjmp end%=\n"
  65. "bit1%=:\n"
  66. " subi r16,0xFE\n"
  67. "end%=:\n"
  68. " mov %[res],r16\n"
  69. : [res] "=r" (res)
  70. : [op] "r" (op)
  71. : "r16", "r17"
  72. );
  73. return res;
  74. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty