
.globl _brightness_altivec
.globl _brightness_ppc
.globl _yuv2rgb_altivec

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; void brightness_sse(unsigned char *image, int len, int v)
;                     r3                    r4       r5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

_brightness_altivec:

  srwi r4, r4, 0x4         ; count = count / 16
  mtctr r4
  ; abs r6, r5               ; v=abs(v);

  mr. r6, r5
  bge bright_not_neg
  neg r6, r6

bright_not_neg:
  andi. r6, r6, 0xff
  mr r8, r6                ; r8 = (v,v,v,v)
  rotlwi r7, r6, 8
  or r8, r8, r7
  rotlwi r7, r6, 16
  or r8, r8, r7
  rotlwi r7, r6, 24
  or r8, r8, r7

  stwu r1, -32(r1)         ; push to stack so it can be added to the vector
  mr r9, r1
  addi r9, r9, 16          ; make r9 a 16 byte aligned address on the SP
  srwi r9, r9, 4
  slwi r9, r9, 4
  stw r8, 0(r9)
  stw r8, 4(r9)
  stw r8, 8(r9)
  stw r8, 12(r9)
  xor r7, r7, r7           ; r7=0
  lvx v1, r9, r7
  addi r1, r1, 32          ; pop last value off stack to /dev/null

  cmpi cr0, r5, 0          ; check if v is negative
  blt bright_dark

bright_loop:
  lvx v0, r3, r7
  vaddubs v0, v0, v1
  stvx v0, r3, r7
  addi r3, r3, 16
  bc 0, 31, bright_loop
  b bright_exit

bright_dark:
  lvx v0, r3, r7
  vsububs v0, v0, v1
  stvx v0, r3, r7
  addi r3, r3, 16
  bc 0, 31, bright_dark

bright_exit:

  blr

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; void brightness_ppc(unsigned char *image, int len, int v)
;                     r3                    r4       r5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

_brightness_ppc:

  mtctr r4
  ; abs r6, r5               ; v=abs(v);

  mr. r6, r5
  ;cmpi cr0, r6, 0
  bge bright_loop_ppc

  neg r6, r6
bright_dark_ppc:
  lbz r5, 0(r3)
  sub. r5, r5, r6
  bge bright_dark_not_neg
  xor r5, r5, r5
bright_dark_not_neg:
  stb r5, 0(r3)
  addi r3, r3, 1
  bc 0, 31, bright_dark_ppc
  b bright_exit_ppc

bright_loop_ppc:
  lbz r5, 0(r3)
  add r5, r5, r6
  cmpi cr0, r5, 255
  ble bright_light_less_255
  li r5, 255
bright_light_less_255:
  stb r5, 0(r3)
  addi r3, r3, 1
  bc 0, 31, bright_loop_ppc

bright_exit_ppc:

  blr

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; void yuv2rgb_altivec(unsigned char *yuv_buffer, unsigned char *rgb_buffer, int width, int height)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

_yuv2rgb_altivec:


  blr

