.machine ppc .globl _remove_comment_asm INT8_MAX = 127 INT16_MAX = 32767 BEGIN_COMMENT = 12074 ; ('/'<<8)+'*' END_COMMENT = 10799 ; ('*'<<8)+'/' ;; char *remove_comment_asm(char *s); ;; ;; r3: char *s ;; r4: char *retval ;; r5: char *buf ;; r6: int in_comment ;; r7: uint32_t next_match ;; r8: uint32_t cs ;; ;; r9: char c (*s) ;; r10: 8 ;; r11: 16 _remove_comment_asm: mr r4, r3 ; retval = s; mr r5, r3 ; buf = s; li r6, 0 ; in_comment = 0; li r7, BEGIN_COMMENT ; next_match = BEGIN_COMMENT; li r8, 0 ; cs = 0; li r10, 8 li r11, 16 _scan: lbz r9, 0(r3) ; (c = *s) cmpli cr7, r9, 0 ; while (*s != 0) { beq cr7, _scan_end slw r8, r8, r10 ; cs <<= 8; or r8, r8, r9 ; cs |= *s; addi r3, r3, 1 ; s++; ;; if ((cs & INT16_MAX) == next_match) -> _match andi. r12, r8, INT16_MAX cmpl cr7, r7, r12 beq cr7, _match ;; else if (!in_comment && cs >= (1<<16)) { ... cmpli cr7, r6, 0 ; !in_comment lis r12, 1 ; (1<<16) cmpl cr6, r8, r12 ; cs >= (1<<16) cror 26, 25, 26 ; cr6[eq] = cr6[gt] || cr6[eq] crand 2, 30, 26 ; cr0[eq] = cr7[eq] && cr6[eq] bne cr0, _scan lis r12, INT8_MAX ; INT8_MAX<<16 and r12, r8, r12 ; cs & (INT8_MAX<<16) srwi r12, r12, 16 ; c = (cs & (INT8_MAX<<16)) >> 16; stb r12, 0(r5) ; *buf = c; addi r5, r5, 1 ; buf++; b _scan _match: xori r6, r6, 1 ; in_comment = !in_comment; cmpli cr7, r6, 1 ; in_comment ? ... bne cr7, _set_begin_comment li r7, END_COMMENT ; next_match = END_COMMENT; b _write_before_comment _set_begin_comment: li r7, BEGIN_COMMENT ; next_match = END_COMMENT; _write_before_comment: mr r13, r8 ; r13 = cs li r8, 0 ; cs = 0 cmpli cr7, r6, 1 ; if (in_comment) ... bne cr7, _scan lis r12, INT8_MAX ; INT8_MAX<<16 and r13, r13, r12 ; c = cs & (INT8_MAX<<16) srw r13, r13, r11 ; c >> 16 stb r13, 0(r5) ; *buf = c; addi r5, r5, 1 ; buf++; b _scan _scan_end: cmpli cr7, r6, 1 ; if (!in_comment) ... beq cr7, _func_return cmpli cr7, r8, 256 ; if (cs >= 256) ... blt cr7, _write_last_byte li r12, INT8_MAX slw r12, r12, r10 ; INT8_MAX<<8 and r13, r8, r12 ; c = cs & (INT8_MAX<<8) srw r13, r13, r10 ; c >> 8 stb r13, 0(r5) ; *buf = c; addi r5, r5, 1 ; buf++; _write_last_byte: andi. r9, r8, INT8_MAX ; cs & INT8_MAX stb r9, 0(r5) ; *buf = c; addi r5, r5, 1 ; buf++; _func_return: li r0, 0 stb r0, 0(r5) ; *buf = 0; mr r3, r4 ; return retval; blr