ev67-strchr.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * arch/alpha/lib/ev67-strchr.S
  3.  * 21264 version contributed by Rick Gorton <rick.gorton@alpha-processor.com>
  4.  *
  5.  * Return the address of a given character within a null-terminated
  6.  * string, or null if it is not found.
  7.  *
  8.  * Much of the information about 21264 scheduling/coding comes from:
  9.  * Compiler Writer's Guide for the Alpha 21264
  10.  * abbreviated as 'CWG' in other comments here
  11.  * ftp.digital.com/pub/Digital/info/semiconductor/literature/dsc-library.html
  12.  * Scheduling notation:
  13.  * E - either cluster
  14.  * U - upper subcluster; U0 - subcluster U0; U1 - subcluster U1
  15.  * L - lower subcluster; L0 - subcluster L0; L1 - subcluster L1
  16.  * Try not to change the actual algorithm if possible for consistency.
  17.  */
  18. #include <alpha/regdef.h>
  19. .set noreorder
  20. .set noat
  21. .align 4
  22. .globl strchr
  23. .ent strchr
  24. strchr:
  25. .frame sp, 0, ra
  26. .prologue 0
  27. ldq_u   t0, 0(a0) # L : load first quadword Latency=3
  28. and a1, 0xff, t3 # E : 00000000000000ch
  29. insbl a1, 1, t5 # U : 000000000000ch00
  30. insbl a1, 7, a2 # U : ch00000000000000
  31. insbl t3, 6, a3 # U : 00ch000000000000
  32. or t5, t3, a1 # E : 000000000000chch
  33. andnot  a0, 7, v0 # E : align our loop pointer
  34. lda t4, -1 # E : build garbage mask
  35. mskqh t4, a0, t4 # U : only want relevant part of first quad
  36. or a2, a3, a2 # E : chch000000000000
  37. inswl a1, 2, t5 # E : 00000000chch0000
  38. inswl a1, 4, a3 # E : 0000chch00000000
  39. or a1, a2, a1 # E : chch00000000chch
  40. or a3, t5, t5 # E : 0000chchchch0000
  41. cmpbge  zero, t0, t2 # E : bits set iff byte == zero
  42. cmpbge zero, t4, t4 # E : bits set iff byte is garbage
  43. /* This quad is _very_ serialized.  Lots of stalling happens */
  44. or t5, a1, a1 # E : chchchchchchchch
  45. xor t0, a1, t1 # E : make bytes == c zero
  46. cmpbge  zero, t1, t3 # E : bits set iff byte == c
  47. or t2, t3, t0 # E : bits set iff char match or zero match
  48. andnot t0, t4, t0 # E : clear garbage bits
  49. cttz t0, a2 # U0 : speculative (in case we get a match)
  50. nop # E :
  51. bne t0, $found # U :
  52. /*
  53.  * Yuk.  This loop is going to stall like crazy waiting for the
  54.  * data to be loaded.  Not much can be done about it unless it's
  55.  * unrolled multiple times - is that safe to do in kernel space?
  56.  * Or would exception handling recovery code do the trick here?
  57.  */
  58. $loop: ldq t0, 8(v0) # L : Latency=3
  59. addq v0, 8, v0 # E :
  60. xor t0, a1, t1 # E :
  61. cmpbge zero, t0, t2 # E : bits set iff byte == 0
  62. cmpbge zero, t1, t3 # E : bits set iff byte == c
  63. or t2, t3, t0 # E :
  64. cttz t3, a2 # U0 : speculative (in case we get a match)
  65. beq t0, $loop # U :
  66. $found: negq    t0, t1 # E : clear all but least set bit
  67. and     t0, t1, t0 # E :
  68. and t0, t3, t1 # E : bit set iff byte was the char
  69. addq v0, a2, v0 # E : Add in the bit number from above
  70. cmoveq t1, $31, v0 # E : Two mapping slots, latency = 2
  71. nop
  72. nop
  73. ret # L0 :
  74. .end strchr