118269c0fSSam Ravnborg/* 218269c0fSSam Ravnborg * memscan.S: Optimized memscan for the Sparc. 318269c0fSSam Ravnborg * 418269c0fSSam Ravnborg * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu) 518269c0fSSam Ravnborg */ 618269c0fSSam Ravnborg 718269c0fSSam Ravnborg/* In essence, this is just a fancy strlen. */ 818269c0fSSam Ravnborg 918269c0fSSam Ravnborg#define LO_MAGIC 0x01010101 1018269c0fSSam Ravnborg#define HI_MAGIC 0x80808080 1118269c0fSSam Ravnborg 1218269c0fSSam Ravnborg .text 1318269c0fSSam Ravnborg .align 4 1418269c0fSSam Ravnborg .globl __memscan_zero, __memscan_generic 1518269c0fSSam Ravnborg .globl memscan 1618269c0fSSam Ravnborg__memscan_zero: 1718269c0fSSam Ravnborg /* %o0 = addr, %o1 = size */ 1818269c0fSSam Ravnborg cmp %o1, 0 1918269c0fSSam Ravnborg bne,a 1f 2018269c0fSSam Ravnborg andcc %o0, 3, %g0 2118269c0fSSam Ravnborg 2218269c0fSSam Ravnborg retl 2318269c0fSSam Ravnborg nop 2418269c0fSSam Ravnborg 2518269c0fSSam Ravnborg1: 2618269c0fSSam Ravnborg be mzero_scan_word 2718269c0fSSam Ravnborg sethi %hi(HI_MAGIC), %g2 2818269c0fSSam Ravnborg 2918269c0fSSam Ravnborg ldsb [%o0], %g3 3018269c0fSSam Ravnborgmzero_still_not_word_aligned: 3118269c0fSSam Ravnborg cmp %g3, 0 3218269c0fSSam Ravnborg bne 1f 3318269c0fSSam Ravnborg add %o0, 1, %o0 3418269c0fSSam Ravnborg 3518269c0fSSam Ravnborg retl 3618269c0fSSam Ravnborg sub %o0, 1, %o0 3718269c0fSSam Ravnborg 3818269c0fSSam Ravnborg1: 3918269c0fSSam Ravnborg subcc %o1, 1, %o1 4018269c0fSSam Ravnborg bne,a 1f 4118269c0fSSam Ravnborg andcc %o0, 3, %g0 4218269c0fSSam Ravnborg 4318269c0fSSam Ravnborg retl 4418269c0fSSam Ravnborg nop 4518269c0fSSam Ravnborg 4618269c0fSSam Ravnborg1: 4718269c0fSSam Ravnborg bne,a mzero_still_not_word_aligned 4818269c0fSSam Ravnborg ldsb [%o0], %g3 4918269c0fSSam Ravnborg 5018269c0fSSam Ravnborg sethi %hi(HI_MAGIC), %g2 5118269c0fSSam Ravnborgmzero_scan_word: 5218269c0fSSam Ravnborg or %g2, %lo(HI_MAGIC), %o3 5318269c0fSSam Ravnborg sethi %hi(LO_MAGIC), %g3 5418269c0fSSam Ravnborg or %g3, %lo(LO_MAGIC), %o2 5518269c0fSSam Ravnborgmzero_next_word: 5618269c0fSSam Ravnborg ld [%o0], %g2 5718269c0fSSam Ravnborgmzero_next_word_preloaded: 5818269c0fSSam Ravnborg sub %g2, %o2, %g2 5918269c0fSSam Ravnborgmzero_next_word_preloaded_next: 6018269c0fSSam Ravnborg andcc %g2, %o3, %g0 6118269c0fSSam Ravnborg bne mzero_byte_zero 6218269c0fSSam Ravnborg add %o0, 4, %o0 6318269c0fSSam Ravnborg 6418269c0fSSam Ravnborgmzero_check_out_of_fuel: 6518269c0fSSam Ravnborg subcc %o1, 4, %o1 6618269c0fSSam Ravnborg bg,a 1f 6718269c0fSSam Ravnborg ld [%o0], %g2 6818269c0fSSam Ravnborg 6918269c0fSSam Ravnborg retl 7018269c0fSSam Ravnborg nop 7118269c0fSSam Ravnborg 7218269c0fSSam Ravnborg1: 7318269c0fSSam Ravnborg b mzero_next_word_preloaded_next 7418269c0fSSam Ravnborg sub %g2, %o2, %g2 7518269c0fSSam Ravnborg 7618269c0fSSam Ravnborg /* Check every byte. */ 7718269c0fSSam Ravnborgmzero_byte_zero: 7818269c0fSSam Ravnborg ldsb [%o0 - 4], %g2 7918269c0fSSam Ravnborg cmp %g2, 0 8018269c0fSSam Ravnborg bne mzero_byte_one 8118269c0fSSam Ravnborg sub %o0, 4, %g3 8218269c0fSSam Ravnborg 8318269c0fSSam Ravnborg retl 8418269c0fSSam Ravnborg mov %g3, %o0 8518269c0fSSam Ravnborg 8618269c0fSSam Ravnborgmzero_byte_one: 8718269c0fSSam Ravnborg ldsb [%o0 - 3], %g2 8818269c0fSSam Ravnborg cmp %g2, 0 8918269c0fSSam Ravnborg bne,a mzero_byte_two_and_three 9018269c0fSSam Ravnborg ldsb [%o0 - 2], %g2 9118269c0fSSam Ravnborg 9218269c0fSSam Ravnborg retl 9318269c0fSSam Ravnborg sub %o0, 3, %o0 9418269c0fSSam Ravnborg 9518269c0fSSam Ravnborgmzero_byte_two_and_three: 9618269c0fSSam Ravnborg cmp %g2, 0 9718269c0fSSam Ravnborg bne,a 1f 9818269c0fSSam Ravnborg ldsb [%o0 - 1], %g2 9918269c0fSSam Ravnborg 10018269c0fSSam Ravnborg retl 10118269c0fSSam Ravnborg sub %o0, 2, %o0 10218269c0fSSam Ravnborg 10318269c0fSSam Ravnborg1: 10418269c0fSSam Ravnborg cmp %g2, 0 10518269c0fSSam Ravnborg bne,a mzero_next_word_preloaded 10618269c0fSSam Ravnborg ld [%o0], %g2 10718269c0fSSam Ravnborg 10818269c0fSSam Ravnborg retl 10918269c0fSSam Ravnborg sub %o0, 1, %o0 11018269c0fSSam Ravnborg 11118269c0fSSam Ravnborgmzero_found_it: 11218269c0fSSam Ravnborg retl 11318269c0fSSam Ravnborg sub %o0, 2, %o0 11418269c0fSSam Ravnborg 11518269c0fSSam Ravnborgmemscan: 11618269c0fSSam Ravnborg__memscan_generic: 11718269c0fSSam Ravnborg /* %o0 = addr, %o1 = c, %o2 = size */ 11818269c0fSSam Ravnborg cmp %o2, 0 11918269c0fSSam Ravnborg bne,a 0f 12018269c0fSSam Ravnborg ldub [%o0], %g2 12118269c0fSSam Ravnborg 12218269c0fSSam Ravnborg b,a 2f 12318269c0fSSam Ravnborg1: 12418269c0fSSam Ravnborg ldub [%o0], %g2 12518269c0fSSam Ravnborg0: 12618269c0fSSam Ravnborg cmp %g2, %o1 12718269c0fSSam Ravnborg be 2f 12818269c0fSSam Ravnborg addcc %o2, -1, %o2 12918269c0fSSam Ravnborg bne 1b 13018269c0fSSam Ravnborg add %o0, 1, %o0 13118269c0fSSam Ravnborg2: 13218269c0fSSam Ravnborg retl 13318269c0fSSam Ravnborg nop 134