12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */ 265ca668fSCyril Bur/* 365ca668fSCyril Bur * Copyright 2015, Cyril Bur, IBM Corp. 465ca668fSCyril Bur */ 565ca668fSCyril Bur 615ec3997SSimon Guo#include "basic_asm.h" 715ec3997SSimon Guo#include "vsx_asm.h" 865ca668fSCyril Bur 965ca668fSCyril Bur#long check_vsx(vector int *r3); 1065ca668fSCyril Bur#This function wraps storeing VSX regs to the end of an array and a 1165ca668fSCyril Bur#call to a comparison function in C which boils down to a memcmp() 1265ca668fSCyril BurFUNC_START(check_vsx) 1365ca668fSCyril Bur PUSH_BASIC_STACK(32) 1465ca668fSCyril Bur std r3,STACK_FRAME_PARAM(0)(sp) 1565ca668fSCyril Bur addi r3, r3, 16 * 12 #Second half of array 1665ca668fSCyril Bur bl store_vsx 1765ca668fSCyril Bur ld r3,STACK_FRAME_PARAM(0)(sp) 1865ca668fSCyril Bur bl vsx_memcmp 1965ca668fSCyril Bur POP_BASIC_STACK(32) 2065ca668fSCyril Bur blr 2165ca668fSCyril BurFUNC_END(check_vsx) 2265ca668fSCyril Bur 2365ca668fSCyril Bur# int preempt_vmx(vector int *varray, int *threads_starting, 2465ca668fSCyril Bur# int *running); 2565ca668fSCyril Bur# On starting will (atomically) decrement threads_starting as a signal 2665ca668fSCyril Bur# that the VMX have been loaded with varray. Will proceed to check the 2765ca668fSCyril Bur# validity of the VMX registers while running is not zero. 2865ca668fSCyril BurFUNC_START(preempt_vsx) 2965ca668fSCyril Bur PUSH_BASIC_STACK(512) 3065ca668fSCyril Bur std r3,STACK_FRAME_PARAM(0)(sp) # vector int *varray 3165ca668fSCyril Bur std r4,STACK_FRAME_PARAM(1)(sp) # int *threads_starting 3265ca668fSCyril Bur std r5,STACK_FRAME_PARAM(2)(sp) # int *running 3365ca668fSCyril Bur 3465ca668fSCyril Bur bl load_vsx 3565ca668fSCyril Bur nop 3665ca668fSCyril Bur 3765ca668fSCyril Bur sync 3865ca668fSCyril Bur # Atomic DEC 3965ca668fSCyril Bur ld r3,STACK_FRAME_PARAM(1)(sp) 4065ca668fSCyril Bur1: lwarx r4,0,r3 4165ca668fSCyril Bur addi r4,r4,-1 4265ca668fSCyril Bur stwcx. r4,0,r3 4365ca668fSCyril Bur bne- 1b 4465ca668fSCyril Bur 4565ca668fSCyril Bur2: ld r3,STACK_FRAME_PARAM(0)(sp) 4665ca668fSCyril Bur bl check_vsx 4765ca668fSCyril Bur nop 4865ca668fSCyril Bur cmpdi r3,0 4965ca668fSCyril Bur bne 3f 5065ca668fSCyril Bur ld r4,STACK_FRAME_PARAM(2)(sp) 5165ca668fSCyril Bur ld r5,0(r4) 5265ca668fSCyril Bur cmpwi r5,0 5365ca668fSCyril Bur bne 2b 5465ca668fSCyril Bur 5565ca668fSCyril Bur3: POP_BASIC_STACK(512) 5665ca668fSCyril Bur blr 5765ca668fSCyril BurFUNC_END(preempt_vsx) 58