1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=arm-eabi -float-abi=soft -verify-machineinstrs < %s \ 3; RUN: | FileCheck --check-prefixes=ARM %s 4; RUN: llc -mtriple=arm-eabi -float-abi=soft -verify-machineinstrs < %s \ 5; RUN: | FileCheck --check-prefixes=NOLIB %s 6 7; Check Y = FNEG(X) -> Y = X ^ sign mask and no lib call is generated. 8define void @test1(float* %a, float* %b) { 9; ARM-LABEL: test1: 10; ARM: @ %bb.0: @ %entry 11; ARM-NEXT: ldr r1, [r1] 12; ARM-NEXT: eor r1, r1, #-2147483648 13; ARM-NEXT: str r1, [r0] 14; ARM-NEXT: mov pc, lr 15; NOLIB-LABEL: test1: 16; NOLIB: eor 17; NOLIB-NOT: bl __aeabi_fsub 18entry: 19 %0 = load float, float* %b 20 %neg = fneg float %0 21 store float %neg, float* %a 22 ret void 23} 24 25define void @test2(double* %a, double* %b) { 26; ARM-LABEL: test2: 27; ARM: @ %bb.0: @ %entry 28; ARM-NEXT: ldr r2, [r1] 29; ARM-NEXT: ldr r1, [r1, #4] 30; ARM-NEXT: str r2, [r0] 31; ARM-NEXT: eor r1, r1, #-2147483648 32; ARM-NEXT: str r1, [r0, #4] 33; ARM-NEXT: mov pc, lr 34; NOLIB-LABEL: test2: 35; NOLIB: eor 36; NOLIB-NOT: bl __aeabi_dsub 37entry: 38 %0 = load double, double* %b 39 %neg = fneg double %0 40 store double %neg, double* %a 41 ret void 42} 43 44define void @test3(fp128* %a, fp128* %b) { 45; ARM-LABEL: test3: 46; ARM: @ %bb.0: @ %entry 47; ARM-NEXT: ldm r1, {r2, r3, r12} 48; ARM-NEXT: ldr r1, [r1, #12] 49; ARM-NEXT: stm r0, {r2, r3, r12} 50; ARM-NEXT: eor r1, r1, #-2147483648 51; ARM-NEXT: str r1, [r0, #12] 52; ARM-NEXT: mov pc, lr 53; NOLIB-LABEL: test3: 54; NOLIB: eor 55; NOLIB-NOT: bl __subtf3 56entry: 57 %0 = load fp128, fp128* %b 58 %neg = fneg fp128 %0 59 store fp128 %neg, fp128* %a 60 ret void 61} 62