alu32.s 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. # mach: bpf
  2. # output: pass\nexit 0 (0x0)\n
  3. ;; alu32.s
  4. ;; Tests for ALU(32) BPF instructions in simulator
  5. .include "testutils.inc"
  6. .text
  7. .global main
  8. .type main, @function
  9. main:
  10. mov32 %r1, 10 ; r1 = 10
  11. mov32 %r2, -5 ; r2 = -5
  12. ;; add
  13. add32 %r1, 1 ; r1 += 1 (r1 = 11)
  14. add32 %r2, -1 ; r2 += -1 (r2 = -6)
  15. add32 %r1, %r2 ; r1 += r2 (r1 = 11 + -6 = 5)
  16. fail_ne32 %r1, 5
  17. ;; sub
  18. sub32 %r1, 5 ; r1 -= 5 (r1 = 0)
  19. sub32 %r1, -5 ; r1 -= -5 (r1 = 5)
  20. sub32 %r1, %r2 ; r1 -= r2 (r1 = 5 - -6 = 11)
  21. fail_ne32 %r1, 11
  22. ;; mul
  23. mul32 %r1, 2 ; r1 *= 2 (r1 = 22)
  24. mul32 %r1, -2 ; r1 *= -2 (r1 = -44)
  25. mul32 %r1, %r2 ; r1 *= r2 (r1 = -44 * -6 = 264)
  26. fail_ne32 %r1, 264
  27. ;; div
  28. div32 %r1, 6
  29. mov32 %r2, 11
  30. div32 %r1, %r2
  31. fail_ne32 %r1, 4
  32. ;; div is unsigned
  33. mov32 %r1, -8 ; 0xfffffff8
  34. div32 %r1, 2
  35. fail_ne32 %r1, 0x7ffffffc ; sign bits are not preserved
  36. ;; and (bitwise)
  37. mov32 %r1, 0xb ; r1 = (0xb = 0b1011)
  38. mov32 %r2, 0x5 ; r2 = (0x5 = 0b0101)
  39. and32 %r1, 0xa ; r1 &= (0xa = 0b1010) = (0b1010 = 0xa)
  40. fail_ne32 %r1, 0xa
  41. and32 %r1, %r2 ; r1 &= r2 = 0x0
  42. fail_ne32 %r1, 0x0
  43. ;; or (bitwise)
  44. or32 %r1, 0xb
  45. or32 %r1, %r2
  46. fail_ne32 %r1, 0xf
  47. ;; lsh (left shift)
  48. lsh32 %r1, 4 ; r1 <<= 4 (r1 = 0xf0)
  49. mov32 %r2, 24 ; r2 = 24
  50. lsh32 %r1, %r2
  51. fail_ne32 %r1, 0xf0000000
  52. ;; rsh (right logical shift)
  53. rsh32 %r1, 2
  54. rsh32 %r1, %r2
  55. fail_ne32 %r1, 0x3c ; (0xf000 0000 >> 26)
  56. ;; arsh (right arithmetic shift)
  57. arsh32 %r1, 1
  58. or32 %r1, 0x80000000
  59. mov32 %r2, 3
  60. arsh32 %r1, %r2
  61. fail_ne %r1, 0x00000000F0000003
  62. ; Note: make sure r1 is NOT sign-extended
  63. ; i.e. upper-32 bits should be untouched
  64. ;; mod
  65. mov32 %r1, 1025
  66. mod32 %r1, 16
  67. fail_ne32 %r1, 1
  68. ;; mod is unsigned
  69. mov32 %r1, 1025
  70. mod32 %r1, -16 ; when unsigned, much larger than 1025
  71. fail_ne32 %r1, 1025
  72. mov32 %r1, -25 ; when unsigned, a large positive which is
  73. mov32 %r2, 5 ; ... not evenly divisible by 5
  74. mod32 %r1, %r2
  75. fail_ne32 %r1, 1
  76. ;; xor
  77. xor32 %r1, %r2
  78. fail_ne32 %r1, 4
  79. xor32 %r1, 0xF000000F
  80. fail_ne %r1, 0xF000000B ; Note: check for (bad) sign-extend
  81. xor32 %r1, %r1
  82. fail_ne %r1, 0
  83. ;; neg
  84. mov32 %r1, -1
  85. mov32 %r2, 0x7fffffff
  86. neg32 %r1
  87. neg32 %r2
  88. fail_ne32 %r1, 1
  89. fail_ne %r2, 0x80000001 ; Note: check for (bad) sign-extend
  90. neg32 %r2
  91. fail_ne32 %r2, 0x7fffffff
  92. pass