1*3e12c5d1SDavid du Colombier TEXT memset(SB),$12 2*3e12c5d1SDavid du ColombierMOVW R1, 0(FP) 3*3e12c5d1SDavid du Colombier 4*3e12c5d1SDavid du Colombier/* 5*3e12c5d1SDavid du Colombier * performance: 6*3e12c5d1SDavid du Colombier * about 1us/call and 28mb/sec 7*3e12c5d1SDavid du Colombier */ 8*3e12c5d1SDavid du Colombier 9*3e12c5d1SDavid du Colombier MOVW n+8(FP), R3 /* R3 is count */ 10*3e12c5d1SDavid du Colombier MOVW p+0(FP), R4 /* R4 is pointer */ 11*3e12c5d1SDavid du Colombier MOVW c+4(FP), R5 /* R5 is char */ 12*3e12c5d1SDavid du Colombier ADDU R3,R4, R6 /* R6 is end pointer */ 13*3e12c5d1SDavid du Colombier 14*3e12c5d1SDavid du Colombier/* 15*3e12c5d1SDavid du Colombier * if not at least 4 chars, 16*3e12c5d1SDavid du Colombier * dont even mess around. 17*3e12c5d1SDavid du Colombier * 3 chars to guarantee any 18*3e12c5d1SDavid du Colombier * rounding up to a word 19*3e12c5d1SDavid du Colombier * boundary and 4 characters 20*3e12c5d1SDavid du Colombier * to get at least maybe one 21*3e12c5d1SDavid du Colombier * full word store. 22*3e12c5d1SDavid du Colombier */ 23*3e12c5d1SDavid du Colombier SGT $4,R3, R1 24*3e12c5d1SDavid du Colombier BNE R1, out 25*3e12c5d1SDavid du Colombier 26*3e12c5d1SDavid du Colombier/* 27*3e12c5d1SDavid du Colombier * turn R5 into a word of characters 28*3e12c5d1SDavid du Colombier */ 29*3e12c5d1SDavid du Colombier AND $0xff, R5 30*3e12c5d1SDavid du Colombier SLL $8,R5, R1 31*3e12c5d1SDavid du Colombier OR R1, R5 32*3e12c5d1SDavid du Colombier SLL $16,R5, R1 33*3e12c5d1SDavid du Colombier OR R1, R5 34*3e12c5d1SDavid du Colombier 35*3e12c5d1SDavid du Colombier/* 36*3e12c5d1SDavid du Colombier * store one byte at a time until pointer 37*3e12c5d1SDavid du Colombier * is alligned on a word boundary 38*3e12c5d1SDavid du Colombier */ 39*3e12c5d1SDavid du Colombierl1: 40*3e12c5d1SDavid du Colombier AND $3,R4, R1 41*3e12c5d1SDavid du Colombier BEQ R1, l2 42*3e12c5d1SDavid du Colombier MOVB R5, 0(R4) 43*3e12c5d1SDavid du Colombier ADDU $1, R4 44*3e12c5d1SDavid du Colombier JMP l1 45*3e12c5d1SDavid du Colombier 46*3e12c5d1SDavid du Colombier/* 47*3e12c5d1SDavid du Colombier * turn R3 into end pointer-15 48*3e12c5d1SDavid du Colombier * store 16 at a time while theres room 49*3e12c5d1SDavid du Colombier */ 50*3e12c5d1SDavid du Colombierl2: 51*3e12c5d1SDavid du Colombier ADDU $-15,R6, R3 52*3e12c5d1SDavid du Colombierl3: 53*3e12c5d1SDavid du Colombier SGTU R3,R4, R1 54*3e12c5d1SDavid du Colombier BEQ R1, l4 55*3e12c5d1SDavid du Colombier MOVW R5, 0(R4) 56*3e12c5d1SDavid du Colombier MOVW R5, 4(R4) 57*3e12c5d1SDavid du Colombier ADDU $16, R4 58*3e12c5d1SDavid du Colombier MOVW R5, -8(R4) 59*3e12c5d1SDavid du Colombier MOVW R5, -4(R4) 60*3e12c5d1SDavid du Colombier JMP l3 61*3e12c5d1SDavid du Colombier 62*3e12c5d1SDavid du Colombier/* 63*3e12c5d1SDavid du Colombier * turn R3 into end pointer-3 64*3e12c5d1SDavid du Colombier * store 4 at a time while theres room 65*3e12c5d1SDavid du Colombier */ 66*3e12c5d1SDavid du Colombierl4: 67*3e12c5d1SDavid du Colombier ADDU $-3,R6, R3 68*3e12c5d1SDavid du Colombierl5: 69*3e12c5d1SDavid du Colombier SGTU R3,R4, R1 70*3e12c5d1SDavid du Colombier BEQ R1, out 71*3e12c5d1SDavid du Colombier MOVW R5, 0(R4) 72*3e12c5d1SDavid du Colombier ADDU $4, R4 73*3e12c5d1SDavid du Colombier JMP l5 74*3e12c5d1SDavid du Colombier 75*3e12c5d1SDavid du Colombier/* 76*3e12c5d1SDavid du Colombier * last loop, store byte at a time 77*3e12c5d1SDavid du Colombier */ 78*3e12c5d1SDavid du Colombierout: 79*3e12c5d1SDavid du Colombier SGTU R6,R4 ,R1 80*3e12c5d1SDavid du Colombier BEQ R1, ret 81*3e12c5d1SDavid du Colombier MOVB R5, 0(R4) 82*3e12c5d1SDavid du Colombier ADDU $1, R4 83*3e12c5d1SDavid du Colombier JMP out 84*3e12c5d1SDavid du Colombier 85*3e12c5d1SDavid du Colombierret: 86*3e12c5d1SDavid du Colombier MOVW s1+0(FP), R1 87*3e12c5d1SDavid du Colombier RET 88*3e12c5d1SDavid du Colombier END 89