xcode 4.4 neon assembly error - neon

I get compilation errors when compiling neon assembly in Xcode 4.4, those error wasn't in xCode 4.3,
the errors are for those commands type:
error: invalid operand for instruction
vld1 q5.u8, [r12], r2
error: invalid operand for instruction
vrhadd d0.u8,d22.u8,d0.u8
error: unexpected token in argument list
vst1 d2.u32[0], [r1], r3
any idea how to solve those errors?
Thank you,

replace vld1 q5.u8, [r12], r2 by vld1.u8 q5, [r12], r2
replace vrhadd d0.u8,d22.u8,d0.u8 by vrhadd.u8 d0,d22,d0
replace vst1 d2.u32[0], [r1], r3 by vst1.u32 d2[0], [r1], r3
This is the instruction that should by type by the size of the regsiter! not the register themselves

Related

PROJ: proj_create: Error 1027 (Invalid value for an argument)

I'm doing gdalwarp on a Cygwin platform. The -s_srs was set as:
-s_srs +proj=lcc +lat_1=30 +lat_2=35 +lat_0=30 +lon_0=87 +x_0=0 +y_0=0 +ellps=WGS84 +a=6370000 +b=6370000 +units=m +no_defs
Then I got this error:
ERROR 1: PROJ: proj_create: Error 1027 (Invalid value for an argument): lcc: Invalid value for lat_1 and lat_2: |lat_1 + lat_2| should be > 0
ERROR 1: Translating source or target SRS failed:
+proj=lcc
I searched everywhere but don't know why...

Valgrind reports "invalid write" at "X bytes below stack pointer"

I'm running some code under Valgrind, compiled with gcc 7.5 targeting an aarch64 (ARM 64 bits) architecture, with optimizations enabled.
I get the following error:
==3580== Invalid write of size 8
==3580== at 0x38865C: ??? (in ...)
==3580== Address 0x1ffeffdb70 is on thread 1's stack
==3580== 16 bytes below stack pointer
This is the assembly dump in the vicinity of the offending code:
388640: a9bd7bfd stp x29, x30, [sp, #-48]!
388644: f9000bfc str x28, [sp, #16]
388648: a9024ff4 stp x20, x19, [sp, #32]
38864c: 910003fd mov x29, sp
388650: d1400bff sub sp, sp, #0x2, lsl #12
388654: 90fff3f4 adrp x20, 204000 <_IO_stdin_used-0x4f0>
388658: 3dc2a280 ldr q0, [x20, #2688]
38865c: 3c9f0fe0 str q0, [sp, #-16]!
I'm trying to ascertain whether this is a possible bug in my code (note that I've thoroughly reviewed my code and I'm fairly confident it's correct), or whether Valgrind will blindly report any writes below the stack pointer as an error.
Assuming the latter, it looks like a Valgrind bug since the offending instruction at 0x38865c uses the pre-decrement addressing mode, so it's not actually writing below the stack pointer.
Furthermore, at address 0x388640 a similar access (and again with pre-decrement addressing mode) is performed, yet this isn't reported by Valgrind; the main difference being the use of an x register at address 0x388640 versus a q register at address 38865c.
I'd also like to draw attention to the large stack pointer subtraction at 0x388650, which may or may not have anything to do with the issue (note this subtraction makes sense, given that the offending C code declares a large array on the stack).
So, will anyone help me make sense of this, and whether I should worry about my code?
The code looks fine, and the write is certainly not below the stack pointer. The message seems to be a valgrind bug, possibly #432552, which is marked as fixed. OP confirms that the message is not produced after upgrading valgrind to 3.17.0.
code declares a large array on the stack
should [I] worry about my code?
I think it depends upon your desire for your code to be more portable.
Take this bit of code that I believe represents at least one important thing you mentioned in your post:
#include <stdio.h>
#include <stdlib.h>
long long foo (long long sz, long long v) {
long long arr[sz]; // allocating a variable on the stack
arr[sz-1] = v;
return arr[sz-1];
}
int main (int argc, char *argv[]) {
long long n = atoll(argv[1]);
long long v = foo(n, n);
printf("v = %lld\n", v);
}
$ uname -mprsv
Darwin 20.5.0 Darwin Kernel Version 20.5.0: Sat May 8 05:10:33 PDT 2021; root:xnu-7195.121.3~9/RELEASE_X86_64 x86_64 i386
$ gcc test.c
$ a.out 1047934
v = 1047934
$ a.out 1047935
Segmentation fault: 11
$ uname -snrvmp
Linux localhost.localdomain 3.19.8-100.fc20.x86_64 #1 SMP Tue May 12 17:08:50 UTC 2015 x86_64 x86_64
$ gcc test.c
$ ./a.out 2147483647
v = 2147483647
$ ./a.out 2147483648
v = 2147483648
There are at least some minor portability concerns with this code. The amount of allocatable stack memory for these two environments differs significantly. And that's only for two platforms. Haven't tried it on my Windows 10 vm but I don't think I need to because I got bit by this one a long time ago.
Beyond OP issue that was due to a Valgrind bug, the title of this question is bound to attract more people (like me) who are getting "invalid write at X bytes below stack pointer" as a legitimate error.
My piece of advice: check that the address you're writing to is not a local variable of another function (not present in the call stack)!
I stumbled upon this issue while attempting to write into the address returned by yyget_lloc(yyscanner) while outside of function yyparse (the former returns the address of a local variable in the latter).

Error while installation of Apache httpd 2.4.2 on AIX OS

We are getting below error while running the make command to build Apache files.
We are carrying out the installation on AIX 6.1 OS.
The installation is completed upto the configuration step as per the procedure given in the below link:
http://httpd.apache.org/docs/2.4/install.html
The error is :
util_pcre.c:48:18: error: pcre.h: No such file or directory
util_pcre.c: In function 'ap_regfree':
util_pcre.c:103: error: 'pcre_free' undeclared (first use in this function)
util_pcre.c:103: error: (Each undeclared identifier is reported only once
util_pcre.c:103: error: for each function it appears in.)
util_pcre.c: In function 'ap_regcomp':
util_pcre.c:129: error: 'PCRE_CASELESS' undeclared (first use in this function)
util_pcre.c:131: error: 'PCRE_MULTILINE' undeclared (first use in this function)
util_pcre.c:133: error: 'PCRE_DOTALL' undeclared (first use in this function)
util_pcre.c:136: warning: implicit declaration of function 'pcre_compile'
util_pcre.c:136: warning: assignment makes pointer from integer without a cast
util_pcre.c:142: warning: implicit declaration of function 'pcre_fullinfo'
util_pcre.c:142: error: expected ')' before 'pcre'
util_pcre.c:142: warning: type defaults to 'int' in declaration of 'type name'
util_pcre.c:143: error: 'PCRE_INFO_CAPTURECOUNT' undeclared (first use in this function)
util_pcre.c: In function 'ap_regexec_len':
util_pcre.c:180: error: 'PCRE_NOTBOL' undeclared (first use in this function)
util_pcre.c:182: error: 'PCRE_NOTEOL' undeclared (first use in this function)
util_pcre.c:198: warning: implicit declaration of function 'pcre_exec'
util_pcre.c:198: error: expected ')' before 'pcre'
util_pcre.c:198: warning: type defaults to 'int' in declaration of 'type name'
util_pcre.c:221: error: 'PCRE_ERROR_NOMATCH' undeclared (first use in this function)
util_pcre.c:223: error: 'PCRE_ERROR_NULL' undeclared (first use in this function)
util_pcre.c:225: error: 'PCRE_ERROR_BADOPTION' undeclared (first use in this function)
util_pcre.c:227: error: 'PCRE_ERROR_BADMAGIC' undeclared (first use in this function)
util_pcre.c:229: error: 'PCRE_ERROR_UNKNOWN_NODE' undeclared (first use in this function)
util_pcre.c:231: error: 'PCRE_ERROR_NOMEMORY' undeclared (first use in this function)
make: 1254-004 The error code from the last command is 1.
Stop.
make: 1254-004 The error code from the last command is 1.
We have also installed the below version GCC compiler for AIX 6.1:-
libgcc-4.2.0-3.aix6.1.ppc.rpm
libstdcplusplus-4.2.0-3.aix6.1.ppc.rpm
libstdcplusplus-devel-4.2.0-3.aix6.1.ppc.rpm
gcc-cplusplus-4.2.0-3.aix6.1.ppc.rpm
Kindly suggest as to what is missing here that is causing the error.

Setup / Errors with Floating Point on TI AM3517 Cortex-A8

I'm getting an undefined instruction exception when executing:
0xED2D8B0E VPUSH {D8-D14}
(Note: The statement was generated by the compiler as part of C language function entry protocol.)
Initialization code:
;; Initialize VFP (if needed).
;; BL __iar_init_vfp HJ REMOVED AND REPLACED WITH BELOW
MRC p15, #0, r1, c1, c0, #2 ; r1 = Access Control Register
ORR r1, r1, #(0xf << 20) ; enable full access for p10,11
MCR p15, #0, r1, c1, c0, #2 ; Access Control Register = r1
MOV r1, #0
MCR p15, #0, r1, c7, c5, #4 ; flush prefetch buffer because of FMXR below
; and CP 10 & 11 were only just enabled
; Enable VFP itself
MOV r0,#0x40000000
FMXR FPEXC, r0 ; FPEXC = r0
I get the undefined exception when the target FPU is set up as VFPv3 or VFPV3 + NEON.
The initialization code is placed in the "cstartup.c" file, at the __iar_program_start and ?cstartup code, following this code snippet:
MRC p15,0,R1,C1,C0,0
LDR R0,=CP_DIS_MASK ;; 0xFFFFEFFA
AND R1,R1,R0
ORR R1,R1,#(1<<12)
MCR p15,0,R1,C1,C0,0
Registers (before VPUSH):
CPSR: 0x80000113
APSR: 0x80000000
SPSR: 0x000001D3
Tools:
IAR Embedded Workbench IDE & Compiler - 7.40
I-Jet debugging probe
Zoom AM3517 eval board
TI AM35X Cortex-A8 processor
Questions:
In the initialization code above, which statements are required for
NEON and which for VFP?
Are there any initialization instructions I'm missing for NEON and
VFP initialization?
Are there statements I need to place in the macro file for the debug
probe?
The code presented in the question correctly initializes the floating point processor on a Cortex-A8 processor.
The issue of getting undefined instruction exception (which led up to this question), was caused by the O.S. writing an invalid value to the FPEXC register, causing the Floating Point Processor to be disabled.

Division of double word in MASM

HDIVIDEND DW 1234H
LDIVIDEND DW 5678H
DIVISOR DW 1234H
MOV AX,LDIVIDEND
MOV DX,HDIVIDEND
DIV DIVISOR
I am getting an "Illeagal instruction" on running a masm code at the instruction
DIV DIVISOR
Where HDIVIDEND is the higher order bytes of dividend in 16 bit. And divisor is 16 bit.
Yes, the program you had written should have assembled correctly. Perhaps you had made a mistake in another part of your file, which would thus be the cause of your "illegal instruction". Or maybe you should download a newer version of MASM as it might have temporarily malfunctioned. Anyway, here is the working code, assembled and linked with MASM64 for Windows (should still work with MASM32):
dseg segment para 'DATA'
hdividend dw 1234h
ldividend dw 5678h
divisor dw 1234h
dseg ends
cseg segment para 'CODE'
start proc
mov ax, ldividend
mov dx, hdividend
div divisor
start endp
cseg ends
end
And the output:
C:\Masm64>bin\ml64.exe /c division.asm
Microsoft (R) Macro Assembler (x64) Version 8.00.50727.215
Copyright (C) Microsoft Corporation. All rights reserved.
Assembling: division.asm
C:\Masm64>bin\link.exe /subsystem:windows /entry:start division.obj
Microsoft (R) Incremental Linker Version 8.00.50727.215
Copyright (C) Microsoft Corporation. All rights reserved.
Hope this helps.