क्या कॉप्रोसेसर निर्देशों के उपयोग को अक्षम करने के लिए हाल ही में जीसीसी के साथ कोई तरीका है: सीडीपी, एलडीसी, एसटीसी, एमसीआर और एमआरसी?

ऐसा लगता है कि वे arm_coproc1_ok नामक एक ऑटोकॉन्फ़ चर में समूहीकृत हैं।

मैंने विकल्प -march=armv4 और -mfloat-abi=soft सेट करने का प्रयास किया लेकिन कुछ भी मदद नहीं करता है। मेरे बायनेरिज़ में हमेशा निर्देश होते हैं।

चाहे वह मेरा स्रोत कोड हो या libc (newlib), मुझे कोप्रो निर्देश मिलते हैं।

यह सी ++ कोड स्रोत,

double Bbp::S(int j)
{
    double s = 0.0;        // Summation of Total, Left
    double t;              // Each term of right summation
    int    r;              // Denominator
    int    k;              // Loop index
    double EPS = 1.0e-17;  // Loop-exit accuration of the right summation

    // Left Sum (0 ... d)
    for (k = 0; k <= d; k++) {
        r = 8 * k + j;
        t = (double)compModExp(16, d - k, r);
        t /= r;
        s += t - (int)t;
        s -= (int)s;
    }

    // Right sum (d + 1 ...)
    while (1) {
        r = 8 * k + j;
        t = std::pow(16.0, (double)(d - k));
        t /= (double)r;
        if (t < EPS) break;
        s += t;
        s -= (int)s;
        k ++;
    }

    return s;
}

... इस बाइनरी को उत्पन्न करें (0x44c पर stc):

000001c0 <_ZN3Bbp1SEi>:
 1c0:   e52de004        push    {lr}            ; (str lr, [sp, #-4]!)
 1c4:   e24dd034        sub     sp, sp, #52     ; 0x34
 1c8:   e58d0004        str     r0, [sp, #4]
 1cc:   e58d1000        str     r1, [sp]
 1d0:   e3a02000        mov     r2, #0
...
 440:   e49df004        pop     {pc}            ; (ldr pc, [sp], #4)
 444:   e1a00000        nop                     ; (mov r0, r0)
 448:   4646d497                        ; <UNDEFINED> instruction: 0x4646d497
 44c:   3c670ef5        stclcc  14, cr0, [r7], #-980    ; 0xfffffc2c

0x080 (mrc निर्देश) पर newlib के libc.a के साथ एक ही टिप्पणी:

00000028 <etens>:
  28:   4a926576        bmi     fe499608 <enan+0xfe49565c>
  2c:   153f804a        ldrne   r8, [pc, #-74]! ; ffffffea <enan+0xffffc03e>
  30:   979ac94c        ldrls   ip, [sl, ip, asr #18]
...
  5c:   75868175        strvc   r8, [r6, #373]  ; 0x175
  60:   4d48c976        vstrmi.16       s25, [r8, #-236]        ; 0xffffff14    ; <UNPREDICTABLE>
  64:   58f89c66        ldmpl   r8!, {r1, r2, r5, r6, sl, fp, ip, pc}^
  68:   5c54bc50        mrrcpl  12, 5, fp, r4, cr0
  6c:   91c6cc65        bicls   ip, r6, r5, ror #24
  70:   a0aea60e        adcge   sl, lr, lr, lsl #12
  74:   46a3e319        ssatmi  lr, #4, r9, lsl #6
  78:   eab7851e        b       fede14f8 <enan+0xfeddd54c>
  7c:   901b98fe                        ; <UNDEFINED> instruction: 0x901b98fe
  80:   de8dddbb        mcrle   13, 4, sp, cr13, cr11, {5}

... दूसरों के बीच जाहिर है।

धन्यवाद।

1
bitmap kid 21 मार्च 2020, 17:50
मतलब जब आप इन निर्देशों के लिए असेंबली भाषा कोड लिखते हैं तो उपकरण अभी भी उन्हें इकट्ठा करते हैं? या जिन पुस्तकालयों को आप परियोजना से जोड़ने के लिए चुनते हैं, वे आपके कोड से स्वतंत्र हैं जो आपने उन सीमाओं के साथ बनाए हैं?
 – 
old_timer
21 मार्च 2020, 17:56
1
उदाहरण के लिए समझाएं कि आप जीसीसी संकलित सी कोड के साथ एमआरसी/एमसीआर कैसे प्राप्त कर रहे हैं। कृपया एक न्यूनतम उदाहरण प्रदान करें।
 – 
old_timer
21 मार्च 2020, 17:57
जवाब के लिए धन्यवाद। मैं अपने प्रश्न में संशोधन करता हूं।
 – 
bitmap kid
21 मार्च 2020, 22:42
यह पहले में एक एसटीसी निर्देश नहीं है जो डेटा को अलग करने वाला डिस्सेबलर है। वही दूसरे में एमसीआर के लिए जाता है। बस कुछ पूल डेटा।
 – 
old_timer
21 मार्च 2020, 23:28
उन्हें बदलने के लिए आपको प्रोग्राम में डेटा मानों को इस तरह बदलना होगा कि वे उन निर्देशों के समान न हों।
 – 
old_timer
21 मार्च 2020, 23:43

2 जवाब

double fun ( void )
{
    double EPS = 1.0e-17;
    return(EPS);
}

00000000 <fun>:
   0:   e28f1008    add r1, pc, #8
   4:   e8910003    ldm r1, {r0, r1}
   8:   e1a0f00e    mov pc, lr
   c:   e1a00000    nop         ; (mov r0, r0)
  10:   4646d497            ; <UNDEFINED> instruction: 0x4646d497
  14:   3c670ef5    stclcc  14, cr0, [r7], #-980    ; 0xfffffc2c

जिसमें से

कोड:

00000000 <fun>:
   0:   e28f1008    add r1, pc, #8
   4:   e8910003    ldm r1, {r0, r1}
   8:   e1a0f00e    mov pc, lr

गद्दी?

   c:   e1a00000    nop         ; (mov r0, r0)

डेटा पूल:

  10:   4646d497            ; <UNDEFINED> instruction: 0x4646d497
  14:   3c670ef5    stclcc  14, cr0, [r7], #-980    ; 0xfffffc2c

और यहाँ तुम जाओ

double fun ( void )
{
    double EPS = 1.0e-16;
    return(EPS);
}

00000000 <fun>:
   0:   e28f1008    add r1, pc, #8
   4:   e8910003    ldm r1, {r0, r1}
   8:   e1a0f00e    mov pc, lr
   c:   e1a00000    nop         ; (mov r0, r0)
  10:   97d889bc            ; <UNDEFINED> instruction: 0x97d889bc
  14:   3c9cd2b2    lfmcc   f5, 1, [r12], {178} ; 0xb2

अलग की गई जानकारी को देखने का सही तरीका है:

00000000 <fun>:
   0:   e28f1008    add r1, pc, #8
   4:   e8910003    ldm r1, {r0, r1}
   8:   e1a0f00e    mov pc, lr
   c:   e1a00000
  10:   4646d497
  14:   3c670ef5

इसे देखने का दूसरा तरीका asm . को संकलित करना है

    .arch armv4
    .eabi_attribute 20, 1
    .eabi_attribute 21, 1
    .eabi_attribute 23, 3
    .eabi_attribute 24, 1
    .eabi_attribute 25, 1
    .eabi_attribute 26, 1
    .eabi_attribute 30, 2
    .eabi_attribute 34, 0
    .eabi_attribute 18, 4
    .file   "so.c"
    .text
    .align  2
    .global fun
    .syntax unified
    .arm
    .fpu softvfp
    .type   fun, %function
fun:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    adr r1, .L3
    ldmia   r1, {r0-r1}
    mov pc, lr
.L4:
    .align  3
.L3:
    .word   1179047063
    .word   1013386997
    .size   fun, .-fun
    .ident  "GCC: (GNU) 9.2.0"

एसटीसी निर्देशों की कमी पर ध्यान दें? यदि आप उन .words को hex में कनवर्ट करते हैं तो आपको वह पैटर्न दिखाई देगा जिसे एक डिस्सेबलर एक stc के रूप में पहचान लेगा यदि उसे नहीं पता था कि यह डेटा था।

और हम देख सकते हैं कि एनओपी कहां से आया।

1
old_timer 21 मार्च 2020, 23:52
"J'ai honte" को अंग्रेजी में क्या कहते हैं? मुझे शर्म आ रही है? एक बड़ा धन्यवाद! आपका धन्यवाद, मैं समझ गया।
 – 
bitmap kid
22 मार्च 2020, 00:44
आप पहले नहीं हैं और आखिरी नहीं हैं। डिस्सेबलर केवल इतना ही कर सकते हैं, सही नहीं हैं और न ही हो सकते हैं।
 – 
old_timer
22 मार्च 2020, 00:45

आप शाब्दिक पूल (डेटा) को कोड के रूप में पढ़ रहे हैं। वे "निर्देश" कभी निष्पादित नहीं होंगे।

अपना मोड़ने का प्रयास करें

double EPS = 1.0e-17;  // Loop-exit accuration of the right summation

हेक्साडेसिमल में लगातार, और आप देखेंगे कि जीसीसी विकल्पों की कोई भी राशि आपके जेनरेट किए गए बाइनरी से इसे खत्म क्यों नहीं करेगी!

0
James Greenhalgh 21 मार्च 2020, 23:25
धन्यवाद जेम्स! मैं अब समझ गया।
 – 
bitmap kid
22 मार्च 2020, 00:48