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