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